2

堆栈溢出,

我有一个包含复数的矩阵(例如 -2.2982235934153075E-11+2.1179547211742553E-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, ...])
4

4 回答 4

4

你可以做:

import numpy as np
a = np.genfromtxt(filename, converters={0: lambda x: x.replace('i','j')},
                  dtype=str)
a = np.complex_(a)

请注意,该converters参数是必需的,因为您的文本文件i用于表示虚部。

在外部转换文本文件以替换所有iby可能会更容易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)

例如...

于 2013-08-16T19:33:31.810 回答
1

我最终不得不这样做的方法是首先replace('i', 'j')为原始 .csv 文件中的所有单元格保存新的、更正的文件。之后,读取 .csv 并dtype=str在后续计算中导致错误,但事实证明您可以使用 .csv 解析 .csv dtype=complex128,这解决了我的所有问题。感谢@Saullo-Castro 对转换的帮助

于 2013-08-19T20:12:52.027 回答
1

以下可能是从多列复数 .csv 文件中获取NumPy 数组的选项:

假设我们有一个file.csv包含两行三列复数的 a:

-0.00034467+0.j,         0.00493246+0.j,         0.00365753-0.00361799j
-0.00782533-0.00081274j,-0.00402968+0.01065282j,-0.01345174+0.00464461j

以下将产生一个 NumPy 数组:

filename = 'file.csv'
data = pd.read_csv(filename, sep=",", header=None)
data = data.applymap(lambda s: np.complex(s.replace('i', 'j'))).values

检查是否data是 NumPy 数组:

>> type(data)
numpy.ndarray

PS:答案基于this answer

于 2019-08-22T14:42:55.320 回答
-1

genfromtxt(...)将 csv 文件导入为带有with的字符串数组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'))
于 2017-11-17T13:17:18.807 回答