保存具有不同子数组长度python的多维数组

时间:2017-01-19 01:20:41

标签: python numpy multidimensional-array

我试图通过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')

我认为这是因为子阵列(列表)的长度不同。

请你帮我解决这个问题吗?

谢谢,

艾萨克

1 个答案:

答案 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,     ,