我试图通过python将具有不同子数组长度的多维数组保存到文本文件中。 我的代码是:
import numpy as np
a = np.arange(10)
b = np.arange(5)*0.1
c = np.arange(3)*10
v = [list(a),list(b),list(c)]
v = np.array(v)
v = v.T
np.savetxt("file.dat",v)
结果显示:
TypeError: Mismatch between array dtype ('object') and format specifier ('%.18e')
我认为这是因为子阵列(列表)的长度不同。
请你帮我解决这个问题吗?
谢谢,
艾萨克
答案 0 :(得分:2)
在v
:
savetxt
In [34]: v
Out[34]:
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[0.0, 0.10000000000000001, 0.20000000000000001, 0.30000000000000004, 0.40000000000000002],
[0, 10, 20]], dtype=object)
In [36]: v.shape
Out[36]: (3,)
这是一个包含3个数组的1d,3个元素数组。 .T
什么也没做。 savetxt
旨在保存2d表。您可能需要尝试从这样的组件创建数组。它们长度不同的事实很重要。
最好savetxt
可以将3个列表写入文件:
In [39]: np.savetxt('test.txt',v,fmt='%s')
In [40]: cat test.txt
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0.0, 0.10000000000000001, 0.20000000000000001, 0.30000000000000004, 0.40000000000000002]
[0, 10, 20]
您期待什么输出?
==============
zip_longest
可以创建“列”。默认填充为None
。我可以用空字符串填充,但是我必须使用%s
fmt。
In [50]: for v in itertools.zip_longest(a,b,c,fillvalue=''):
...: print('%5s, %5s. %5s'%tuple(v))
0, 0.0. 0
1, 0.1. 10
2, 0.2. 20
3, 0.3.
4, 0.4.
5, .
6, .
7, .
8, .
9, .
或者使用中间数组:
In [51]: arr=np.array(list(itertools.zip_longest(a,b,c,fillvalue='')))
In [52]: arr
Out[52]:
array([['0', '0.0', '0'],
['1', '0.1', '10'],
['2', '0.2', '20'],
['3', '0.3', ''],
['4', '0.4', ''],
['5', '', ''],
['6', '', ''],
['7', '', ''],
['8', '', ''],
['9', '', '']],
dtype='<U32')
In [53]: np.savetxt('test.txt',arr, fmt='%5s',delimiter=',')
In [54]: cat test.txt
0, 0.0, 0
1, 0.1, 10
2, 0.2, 20
3, 0.3,
4, 0.4,
5, ,
6, ,
7, ,
8, ,
9, ,