gpt4 book ai didi

python - 将多个不同 dtype 的 Numpy 数组写入 CSV 文件的列

转载 作者:太空宇宙 更新时间:2023-11-04 03:06:54 25 4
gpt4 key购买 nike

将多个不同 dtype 的 numpy 数组写入单个 CSV 文件的不同列的最佳方法是什么?

例如,给定以下数组:

array([[1, 2],
[3, 4],
[5, 6]])

array([[ 10., 20.],
[ 30., 40.],
[ 50., 60.]])

我想获取一个文件(分隔符无关):

1 2 10.0 20.0
3 4 30.0 40.0
5 6 50.0 60.0

最理想的是,我希望能够以这种方式编写数组列表,其中每个数组的格式/dtype 可以不同。

我试着查看 savetxt,但我不清楚如果数组具有不同的类型如何使用它。

最佳答案

In [38]: a=np.arange(1,7).reshape(3,2)
In [39]: b=np.arange(10,70.,10).reshape(3,2)
In [40]: c=np.concatenate((a,b),axis=1)
In [41]: c
Out[41]:
array([[ 1., 2., 10., 20.],
[ 3., 4., 30., 40.],
[ 5., 6., 50., 60.]])

所有值都是 float ;默认 savetxt 是一个普通的 float :

In [43]: np.savetxt('test.csv',c)
In [44]: cat test.csv
1.000000000000000000e+00 2.000000000000000000e+00 1.000000000000000000e+01 2.000000000000000000e+01
3.000000000000000000e+00 4.000000000000000000e+00 3.000000000000000000e+01 4.000000000000000000e+01
5.000000000000000000e+00 6.000000000000000000e+00 5.000000000000000000e+01 6.000000000000000000e+01

使用自定义 fmt 我可以获得:

In [46]: np.savetxt('test.csv',c,fmt='%2d %2d %5.1f %5.1f')
In [47]: cat test.csv
1 2 10.0 20.0
3 4 30.0 40.0
5 6 50.0 60.0

更一般地说,我们可以用复合数据类型制作一个c。这里不需要只用 float 和整数,但用字符串就很重要了。但是我们仍然需要很长的 fmt 才能正确显示列。

np.rec.fromarrays 是生成结构化数组的简单方法。不幸的是,它只适用于扁平阵列。因此,对于您的 (3,2) 数组,我需要单独列出列。

In [52]: c = np.rec.fromarrays((a[:,0],a[:,1],b[:,0],b[:,1]))
In [53]: c
Out[53]:
rec.array([(1, 2, 10.0, 20.0), (3, 4, 30.0, 40.0), (5, 6, 50.0, 60.0)],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<f8'), ('f3', '<f8')])
In [54]: np.savetxt('test.csv',c,fmt='%2d %2d %5.1f %5.1f')
In [55]: cat test.csv
1 2 10.0 20.0
3 4 30.0 40.0
5 6 50.0 60.0

我正在使用相同的 savetxt

我还可以创建一个包含 2 个字段的结构化数组,每个字段有 2 列。我不确定 savetxt 是否适用。

savetxt 基本上遍历数组的第一个维度,并对每一行进行格式化写入,大致如下:

for row in arr:
f.write(fmt%tuple(row))

其中 fmt 来自您的参数。

编写您自己的迭代 2 个数组的版本并不难,并为每对行执行单独的格式化写入。

for r1,r2 in zip(a,b):
print('%2d %2d'%tuple(r1), '%5.1f %5.1f'%tuple(r2))

===================

尝试复合数据类型

In [60]: np.dtype('2i,2f')
Out[60]: dtype([('f0', '<i4', (2,)), ('f1', '<f4', (2,))])
In [61]: c=np.zeros(a.shape[0], np.dtype('2i,2f'))
In [62]: c['f0']=a
In [63]: c['f1']=b
In [64]: c
Out[64]:
array([([1, 2], [10.0, 20.0]), ([3, 4], [30.0, 40.0]),
([5, 6], [50.0, 60.0])],
dtype=[('f0', '<i4', (2,)), ('f1', '<f4', (2,))])
In [65]: np.savetxt('test.csv',c,fmt='%2d %2d %5.1f %5.1f')
---
ValueError: fmt has wrong number of % formats: %2d %2d %5.1f %5.1f

所以像这样写一个复合数据类型是行不通的。考虑到一行 c 看起来像:

In [69]: tuple(c[0]) 
Out[69]: (array([1, 2], dtype=int32), array([ 10., 20.], dtype=float32))

我不应该感到惊讶。

我可以用 %s 格式保存这两个 block ,但这会留下括号。

In [66]: np.savetxt('test.csv',c,fmt='%s %s')
In [67]: cat test.csv
[1 2] [ 10. 20.]
[3 4] [ 30. 40.]
[5 6] [ 50. 60.]

我认为有一个np.rec 函数可以展平数据类型。但我也可以使用 view 来做到这一点:

In [72]: np.savetxt('test.csv',c.view('i,i,f,f'),fmt='%2d %2d %5.1f %5.1f')
In [73]: cat test.csv
1 2 10.0 20.0
3 4 30.0 40.0
5 6 50.0 60.0

因此,只要您处理的是数值,简单的连接就和更复杂的结构化方法一样好。

============

关于python - 将多个不同 dtype 的 Numpy 数组写入 CSV 文件的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39183471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com