numpy 如何在Python中保存一个庞大的结构化数组?

piv4azn7  于 2023-03-02  发布在  Python
关注(0)|答案(1)|浏览(125)

我有一个如下格式的数组(修改后适合此处):

array([(0.358174, -0.508718, 2728, 0.103, 23.255, 22.633, 22.459, 21.911, 21.211, 0.487, 0.126, 0.145, 0.129, 0.264, 23.028, 22.621, 22.563, 22.039, 21.24 , 0.378, 0.164, 0.14 , 0.125, 0.248, 3, 1),
...,
(3.881584, -0.209449, 5052, 0.075, 22.778, 22.741, 22.187, 21.901, 21.29 , 0.308, 0.128, 0.124, 0.148, 0.345, 22.801, 22.859, 22.291, 22.047, 21.441, 0.285, 0.141, 0.119, 1.056, 0.323, 3, 0)],
dtype=[('ra', '<f8'), ('dec', '<f8'), ('run', '<i2'), ('rExtSFD', '<f8'), ('uRaw', '<f8'), ('gRaw', '<f8'), ('rRaw', '<f8'), ('iRaw', '<f8'), ('zRaw', '<f8'), ('uErr', '<f8'), ('gErr', '<f8'), ('rErr', '<f8'), ('iErr', '<f8'), ('zErr', '<f8'), ('uRawPSF', '<f8'), ('gRawPSF', '<f8'), ('rRawPSF', '<f8'), ('iRawPSF', '<f8'), ('zRawPSF', '<f8'), ('upsfErr', '<f8'), ('gpsfErr', '<f8'), ('rpsfErr', '<f8'), ('ipsfErr', '<f8'), ('zpsfErr', '<f8'), ('type', '<i2'), ('ISOLATED', '<i4')])

我想找到一种方法将这个数组保存在一个txt文件中,这样当我返回data.dtype.names[:5]时,例如(重新加载文件),我可以得到('ra', 'dec', 'run', 'rExtSFD', 'uRaw')
但是,到目前为止我所做的所有尝试(例如使用np.savetxt,并为所有dtypes设置fmt='%f...')都没有成功。我不想求助于Pandas。有人有什么建议吗?

ni65a41a

ni65a41a1#

下面是一个小例子:

In [124]: dt = np.dtype([('x','f'),('y','i')])    
In [125]: dt
Out[125]: dtype([('x', '<f4'), ('y', '<i4')])    
In [126]: arr = np.array([(1,2),(3,4),(5,6)],dt)    
In [127]: arr
Out[127]: array([(1., 2), (3., 4), (5., 6)], dtype=[('x', '<f4'), ('y', '<i4')])

保存阵列,并显示生成的文件:

In [131]: np.savetxt('test.txt',arr, fmt='%f, %d',header='x, y',comments='')

In [132]: !more test.txt
x, y
1.000000, 2
3.000000, 4
5.000000, 6

这可以装载:

In [133]: data = np.genfromtxt('test.txt',delimiter=',',dtype=None, names=True)    
In [134]: data
Out[134]: array([(1., 2), (3., 4), (5., 6)], dtype=[('x', '<f8'), ('y', '<i4')])

savetxt只是遍历arr,并将fmt%tuple(row)写入文件。数组dtype不用于此操作。
header可以从arr.dtype.names派生。我显式地关闭了默认的注解字符。
genfromtxt读取文本文件;dtype=None告诉它推导列数据类型。names=True告诉它从标题中获取数据类型名称。
如果没有标头,或者忽略它,我们可以直接使用dtype:

In [136]: np.genfromtxt('test.txt',delimiter=',',dtype=dt, skip_header=1)
Out[136]: array([(1., 2), (3., 4), (5., 6)], dtype=[('x', '<f4'), ('y', '<i4')])

注意,csv文件本身并不直接具有dtype信息;它必须被推断出来,或者你必须事先知道它。

相关问题