使用NumPy读取带有复数的.csv文件

3

stackoverflow,

我有一个包含复数(例如-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, ...])

粘贴你使用过的代码并粘贴一个示例输入(最好是输入文件的一部分) - Jakub M.
4个回答

4

您可以:

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

请注意,由于您的文本文件使用“i”表示虚部,因此需要使用“converters”参数。
如果您有很多列的话,可能更容易在外部将您的文本文件转换为替换所有的“i”为“j”,以避免复杂的“转换器”参数。
如果您的带有虚数的文本文件格式为:
 (-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)

例如...

3
这适用于单列数据。看起来数据应该是多列的。我可能会在外部使用sed、awk甚至perl将'i'转换为'j',然后使用dtype=np.complex读取转换后的文件。 - Craig J Copi
如果您可以在外部进行转换,则不需要为此情况使用“converters”参数... - Saullo G. P. Castro
1
没错,你就不必担心文件中实际列数了。但是,OP的限制条件并不是完全清楚。 - Craig J Copi
看起来最好的做法是将 .csv 文件作为字符串导入,然后解析/替换 'i' 为 'j',最后将我的新列表(?)导入到 numpy 数组中?这是假设 numpy 能够识别采用 XXX + XXXj 形式的复数。 - 1ifbyLAN2ifbyC
1
如果文件写成(x + yj)的形式,包括括号,那么可以很容易地使用loadtxtgenfromtxt读取,就像答案中所示的那样。@1ifbyLAN2ifbyC - Saullo G. P. Castro
显示剩余4条评论

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

1
以下可能是从多列复数.csv文件中获取NumPy数组的选项:
假设我们有一个包含两行三列复数的file.csv文件:
-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


-1

使用genfromtxt(...)将csv文件导入为字符串数组,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'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接