使用 flat 迭代器填充数组的一种简单而快速的方法:
In [180]: arr = np.arange(1,13).reshape(3,4)
In [181]: arr
Out[181]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
In [182]: res = np.zeros((3,5),int)
In [183]: res.flat[:arr.size] = arr
In [184]: res
Out[184]:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 0, 0, 0]])
显然,“填充”取决于我们最初放入 res 的内容。对于数值数据,0 和 1 是最简单的。其他值也是可能的,例如 nan 用于浮点数,或 '' 用于字符串条目。
In [191]: res = np.zeros((3,5),'U10')
In [192]: res
Out[192]:
array([['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', '']], dtype='<U10')
In [193]: res.flat[:arr.size] = arr
In [194]: res
Out[194]:
array([['1', '2', '3', '4', '5'],
['6', '7', '8', '9', '10'],
['11', '12', '', '', '']], dtype='<U10')
但是您希望如何将此数组写入文件? savetxt 期望使用大小和数据类型一致的行。 %s fmt 可以写任何东西,但你会失去大多数格式和对齐控制。
这最后一个看起来不像 csv 太糟糕:
In [195]: np.savetxt('test', res, delimiter=',', fmt='%10s')
In [196]: cat test
1, 2, 3, 4, 5
6, 7, 8, 9, 10
11, 12, , ,
它甚至可以加载:
In [199]: np.loadtxt('test', dtype='str', delimiter=',')
Out[199]:
array([[' 1', ' 2', ' 3', ' 4',
' 5'],
[' 6', ' 7', ' 8', ' 9',
' 10'],
[' 11', ' 12', ' ', ' ',
' ']], dtype='<U10')
In [201]: np.genfromtxt('test', dtype=float, delimiter=',')
Out[201]:
array([[ 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10.],
[11., 12., nan, nan, nan]])