4

Python で複素数のリストをインポートおよびエクスポートするコードを作成しようとしています。これまでのところ、csv モジュールを使用してこれを試みています。次を使用してデータをファイルにエクスポートしました。

spamWriter = csv.writer(open('data.csv', 'wb')
spamWriter.writerow(complex_data)

ここで、complex データは、complex(re,im) 関数によって生成されたリスト番号です。元:

print complex_data
[(37470-880j),(35093-791j),(33920-981j),(28579-789j),(48002-574j),(46607-2317j),(42353-1557j),(45166-2520j),(45594-232j),(41149+561j)]

これを後でインポートするには、次のことを試します。

mycsv = csv.reader(open('data.csv', 'rb'))
out = list(mycsv)
print out
[['(37470-880j)','(35093-791j)','(33920-981j)','(28579-789j)','(48002-574j)','(46607-2317j)','(42353-1557j)','(45166-2520j)','(45594-232j)','(41149+561j)']]

(これはリストのリストであることに注意してください。この例ではたまたま 1 行しか使用していませんでした。)

これを文字列ではなく複素数に変換する必要があります。この質問のようにマッピングでこれを行う方法があるはずだと思いますが、それを機能させる方法がわかりませんでした。どんな助けでも大歓迎です!

または、私が知らない複雑な値のデータをインポート/エクスポートする簡単な方法があれば、まったく別の方法を試してみたいと思います。

4

5 に答える 5

9

文字列をに渡すだけcomplex()です:

>>> complex('(37470-880j)')
(37470-880j)

同様int()に、複素数の文字列表現を取り、それを解析します。map()リストに対してこれを行うために使用できます:

map(complex, row)
于 2012-07-25T22:00:57.813 に答える
8
>>> c = ['(37470-880j)','(35093-791j)','(33920-981j)']
>>> map(complex, c)
[(37470-880j), (35093-791j), (33920-981j)]
于 2012-07-25T22:04:43.350 に答える
1
complex_out = []
for row in out:
    comp_row = [complex(x) for x in row]
    complex_out.append(comp_row)
于 2012-07-25T22:01:34.147 に答える
0

CSV ドキュメントには次のように記載されています。

複素数は括弧で囲まれて書き出されることに注意してください。これにより、CSV ファイルを読み取る他のプログラムで問題が発生する可能性があります (それらが複素数をサポートしていると仮定した場合)。

これにより、「out」の要素が文字列型から複素数に変換されます。これは、既存のコードを考えると、複雑でないエントリを簡単に処理できる最も簡単なソリューションです。

 for i,row in enumerate(out):
      j,entry in enumerate(row):
          try:
               out[i][j] = complex(out[i][entry])
          except ValueError:
               # Print here if you want to know something bad happened
               pass

それ以外の場合、各行で map(complex, row) を使用すると、行数が少なくなります。

 for i,row in enumerate(out):
      out[i] = map(complex, row)
于 2012-07-25T22:03:22.307 に答える