Преобразование чисел из экспорта Mathematica CSV в массив Numpy сложный - PullRequest
0 голосов
/ 27 апреля 2018

Я экспортировал данные из Mathematica в CSV-файл. Структура файла выглядит следующим образом:

"x","y","Ex","Ey"
0.,0.,0.+0.*I,-3.0434726787506006*^-12+3.4234894344189825*^-12*I
0.,0.,0.+0.*I,-5.0434726787506006*^-12+10.4234894344189825*^-13*I
...

Я читаю данные с пандами, но я получаю сообщение об ошибке

import csv
import pandas as pd
import numpy as np

df=pd.read_csv('filename.csv')

df.columns=['x', 'y', 'Ex','Ey']

df['Ey'] = df['Ey'].str.replace('*^','E')
df['Ey'] = df['Ey'].str.replace('I','1j').apply(lambda x: np.complex(x))

Редактировать: я получаю следующую ошибку во второй последней строке моего кода:

Traceback (most recent call last):
  File "plot.py", line 6, in <module>
    df['Ey'] = df['Ey'].str.replace('*^','E')
  File "/home/.../.local/lib/python2.7/site-packages/pandas/core/strings.py", line 1579, in replace
    flags=flags)
  File "/home/.../.local/lib/python2.7/site-packages/pandas/core/strings.py", line 424, in str_replace
    regex = re.compile(pat, flags=flags)
  File "/usr/lib/python2.7/re.py", line 194, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python2.7/re.py", line 251, in _compile
    raise error, v # invalid expression
sre_constants.error: nothing to repeat

Когда я пишу вместо

df['Ey'] = df['Ey'].str.replace('*','E')

или

df['Ey'] = df['Ey'].str.replace('^','E')

Я не получаю ошибку. Кажется, что можно дать только один символ, который будет заменен?

1 Ответ

0 голосов
/ 27 апреля 2018

Зачем мучаться с поплавками в кодировке ascii?

Здесь показано, как обмениваться сложными массивами между python и mathematica, используя необработанные двоичные файлы.

в Mathematica:

 cdat = RandomComplex[{0, 1 + I}, 5]

{0,0142816 + 0,0835513 I, 0,434109 + 0,977644 I, 0,579678 + 0,337286 I, 0,426271 + 0,166166 I, 0,363249 + 0,0867334 I}

 f = OpenWrite["test", BinaryFormat -> True]
 BinaryWrite[f, cdat, "Complex64"]
 Close[f]

или

 Export["test", cdat, "Binary", "DataFormat" -> "Complex64"]

в питоне:

import numpy as np
x=np.fromfile('test',np.complex64)
print x

[0,01428160 + 0,0835513j 0,43410850 + 0,97764391j 0,57967812 + 0,3372865j 0,42627081 + 0,16616575j 0,36324903 + 0,08673338j]

идет другим путем:

y=np.array([[1+2j],[3+4j]],np.complex64)
y.tofile('test')

f = OpenRead["test", BinaryFormat -> True]
BinaryReadList[f, "Complex64"]
Close[f]

обратите внимание, что это будет на несколько порядков быстрее, чем обмен данными через CSV.

...