如何将普通的numpy数组转换为记录数组?

3

I read in a sequence of numbers with

np.array(f.read().split(),dtype=np.float64)

然后我使用 np.reshape() 将其转换为二维数组。

在此之后,如何将 arr 转换为记录数组?我尝试了(类似于)以下内容:

filename = 'unstructured-file.txt'
nfields = 3
names = ('r','g','b')
with open(filename,'r') as f:
    arr = np.array(f.read().split(),dtype=np.float64)
    arr = arr.reshape(-1,nfields)
    out = np.array(arr,dtype=zip(names,['float64']*length(names))

但是显示 TypeError:期望可读取的缓冲区对象

有什么建议吗?

编辑:我想要做的主要事情是给我的列命名。

而不是

out = np.array(arr,dtype=zip(names,['float64']*length(names))

如果我使用这个,

out = np.core.records.fromrecords(arr.reshape(-1,nfields),names=','.join(names))

我可以使用out['r']等,但是out.dtype.names为None。这是怎么回事? 编辑2 非结构化文件看起来像:
 Some text
 More text
       100  1.000000E-01        46
 -1.891701E+04  1.702921E+02 -2.323660E+04  4.547841E+03 -2.778444E+04
  0.000000E+00  0.000000E+00  0.000000E+00  0.000000E+00 -2.149862E+04
  1.753467E+02  3.410277E+03 -1.034898E+05  2.778692E+04  0.000000E+00
  0.000000E+00  0.000000E+00  0.000000E+00  1.492281E+04  0.000000E+00
  0.000000E+00  0.000000E+00  9.000000E+01  9.000000E+01  9.000000E+01
  0.000000E+00 -4.774939E-01  0.000000E+00  0.000000E+00  0.000000E+00
 -2.243495E-01  3.513048E-01 -2.678782E-01  3.513048E-01 -7.155493E-01
  5.690034E-01 -2.678782E-01  5.690034E-01 -4.783123E-01  2.461974E+01
  0.000000E+00  0.000000E+00  0.000000E+00  2.461974E+01  0.000000E+00
  0.000000E+00  0.000000E+00  2.461974E+01
       200  2.000000E-01        46
 -1.891815E+04  1.421984E+02 -2.424678E+04  5.199451E+03 -2.944623E+04
  0.000000E+00  0.000000E+00  0.000000E+00  0.000000E+00 -2.174561E+04
  1.274613E+02 -6.004790E+01 -1.139308E+05  2.944807E+04  0.000000E+00
  0.000000E+00  0.000000E+00  0.000000E+00  1.445855E+04  0.000000E+00
  0.000000E+00  0.000000E+00  9.000000E+01  9.000000E+01  9.000000E+01
  0.000000E+00  7.785923E-01  0.000000E+00  0.000000E+00  0.000000E+00
  8.123304E-01  3.023486E-01 -5.891595E-01  3.023486E-01 -8.560144E-02
 -3.830618E-01 -5.891595E-01 -3.830618E-01  1.608437E+00  2.436174E+01
  0.000000E+00  0.000000E+00  0.000000E+00  2.436174E+01  0.000000E+00
  0.000000E+00  0.000000E+00  2.436174E+01
1个回答

5

要将一个普通的numpy数组转换为结构化数组,请使用view

import numpy as np

filename = 'unstructured-file.txt'
nfields = 3
names = ('r','g','b')
with open(filename,'r') as f:
    arr = np.array(f.read().split(),dtype=np.float64)
    arr = arr.reshape(-1,nfields)
    out = arr.view(dtype=zip(names,['float64']*len(names))).copy()

谢谢,但我的意思是'unstructured-file.txt'的指定表示它不在表格中,因此对此无效。 - hatmatrix
你能举个例子说明unstructured-file.txt是什么样子的吗? - unutbu
很棒 - 如果不使用 .copy() 方法会发生什么?似乎还能正常工作? - hatmatrix
2
out=arr.view(...) 会使 out 成为 arr 的一个视图。因此,修改 out 也会修改 arr。它们共享相同的底层数据。我添加了 copy() 以使 out 成为一个独立的数组。两种方法都有用; 这取决于你想做什么。 - unutbu

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