и NumPy читать.csv с комплексным числом


Stackoverflow,

У меня есть матрица, содержащая комплексные числа (напр. -2.2982235934153075 е-11+2.1179547211742553 электронной версии 9i), что мне нужно импортировать в массив NumPy. Я использую genfromtext(file) для анализа всех моих других, реальных значений, но я получаю nan для всех комплексных значений. Есть идеи?

self.raw = (genfromtxt(self.loc, delimiter=',', skip_header=9, dtype=float))
[m,n] = shape(self.raw)
data = zeros((m, n-3))
data[:, :] = self.raw[:, 3::]

Возвращает:

data = array([nan, nan, nan, ...])
3 2

3 ответа:

Вы можете сделать:

import numpy as np
a = np.genfromtxt(filename, converters={0: lambda x: x.replace('i','j')},
                  dtype=str)
a = np.complex_(a)
Обратите внимание, что параметр converters был необходим, поскольку ваш текстовый файл использует i для обозначения мнимой части.

Может быть проще преобразовать ваш текстовый файл извне, чтобы заменить все i на j, избегая сложного аргумента converters, Если у вас много столбцов.

Если ваш текстовый файл с мнимыми числами имеет формат:

 (-2.298223593415307508e-11+2.117954721174255306e-09j)
 (-2.298223593415307508e-11+2.117954721174255306e-09j)
 (-2.298223593415307508e-11+2.117954721174255306e-09j)
 (-2.298223593415307508e-11+2.117954721174255306e-09j)
 (-2.298223593415307508e-11+2.117954721174255306e-09j)
 (-2.298223593415307508e-11+2.117954721174255306e-09j)
 (-2.298223593415307508e-11+2.117954721174255306e-09j)

Где вы можете читать, используя только:

a = np.loadtxt(filename).view(complex)

Например...

Способ, которым мне пришлось это сделать, состоял в том, чтобы сначала replace('i', 'j') для всех ячеек в оригинале .csv-файл и сохраните новый, исправленный файл. Потом, читая книгу .csv с dtype=str вызвал ошибки в последующих вычислениях, но, оказывается, вы можете их разобрать .csv с dtype=complex128, который решил все мои проблемы. Спасибо за помощь в преобразовании @Saullo-Castro

Импортируйте csv-файл в виде массива строк с помощью genfromtxt(...) с помощью dtype='str'. Затем вы можете манипулировать каждой записью с помощью np.vectorize(...).

import numpy as np
from numpy import genfromtxt

# import data as an array of strings using the dtype
temp = genfromtxt('matlab_sim_Z.csv', delimiter=',',dtype='str')

# perform elementwise conversion to complex numpers
mapping = np.vectorize(lambda t:complex(t.replace('i','j')))
data = mapping(temp)

В одной строке:

data = np.vectorize(lambda t:complex(t.replace('i','j'))) (genfromtxt('matlab_sim_Z.csv', delimiter=',',dtype='str'))