【问题标题】:numpy read .csv with complex numbernumpy 用复数读取 .csv
【发布时间】:2013-08-19 06:48:22
【问题描述】:

堆栈溢出,

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

【问题讨论】:

  • 粘贴您使用的一些代码并粘贴示例性输入(最好是输入文件的一部分)

标签: python csv file-io numpy complex-numbers


【解决方案1】:

你可以这样做:

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)

例如...

【讨论】:

  • 这适用于单列。看来数据应该是多列的。我可能会在外部转换数据文件中的 'i'->'j',可能使用 sed、awk 甚至 perl!,然后使用 dtype=np.complex 读入转换后的文件
  • 如果您可以在外部进行转换,则不需要在这种情况下使用converters 参数...
  • 对,您不必担心文件中的实际列数。目前还不完全清楚 OP 的约束是什么。
  • 在这里,python 似乎将 .csv ([m,n] =[2500, 400]) 的列作为字符串读取。编辑:'Python'
  • @1ifbyLAN2ifbyC 是的...如果文件写成(x + yj),包括括号,使用loadtxtgenfromtxt 很容易读取,如答案中所示...
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    将 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'))
    

    【讨论】:

      【解决方案4】:

      以下可能是从 多列 复杂编号的 .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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-04
        • 2016-02-19
        • 1970-01-01
        • 2018-12-25
        • 2019-08-24
        • 1970-01-01
        • 1970-01-01
        • 2020-06-07
        相关资源
        最近更新 更多