如果你想将其写入到磁盘,以便它会很容易在读回作为numpy的阵列,看看numpy.save
。酸洗它也可以很好地工作,但是对于大型阵列来说它效率较低(这不是你的,所以或者是非常好的)。
如果你希望它是人类可读的,看看numpy.savetxt
。
编辑:所以,好像savetxt
不用于> 2名维数组作为相当大的选择......但是,仅仅绘制一切出它的全部结论:
我刚刚意识到numpy.savetxt
ndarrays上的笛卡儿超过2个维度...这可能是通过设计,因为没有内在定义的方式来指示文本文件中的其他维度。
E.g.这(二维数组)工作正常
import numpy as np
x = np.arange(20).reshape((4,5))
np.savetxt('test.txt', x)
而同样的事情会失败(一个相当不提供信息的错误:TypeError: float argument required, not numpy.ndarray
)的三维阵列:
import numpy as np
x = np.arange(200).reshape((4,5,10))
np.savetxt('test.txt', x)
一个解决办法就是打破3D (或更大)阵列分成2D切片。例如。
x = np.arange(200).reshape((4,5,10))
with file('test.txt', 'w') as outfile:
for slice_2d in x:
np.savetxt(outfile, slice_2d)
然而,我们的目标是清晰可读,同时仍然容易读回与numpy.loadtxt
。因此,我们可以稍微详细一点,并使用注释掉的线区分切片。默认情况下,numpy.loadtxt
将忽略任何以#
开头的行(或任何由comments
kwarg指定的字符)。 (这看起来更详细的比它实际上是...)
import numpy as np
# Generate some test data
data = np.arange(200).reshape((4,5,10))
# Write the array to disk
with file('test.txt', 'w') as outfile:
# I'm writing a header here just for the sake of readability
# Any line starting with "#" will be ignored by numpy.loadtxt
outfile.write('# Array shape: {0}\n'.format(data.shape))
# Iterating through a ndimensional array produces slices along
# the last axis. This is equivalent to data[i,:,:] in this case
for data_slice in data:
# The formatting string indicates that I'm writing out
# the values in left-justified columns 7 characters in width
# with 2 decimal places.
np.savetxt(outfile, data_slice, fmt='%-7.2f')
# Writing out a break to indicate different slices...
outfile.write('# New slice\n')
这产生了:
# Array shape: (4, 5, 10)
0.00 1.00 2.00 3.00 4.00 5.00 6.00 7.00 8.00 9.00
10.00 11.00 12.00 13.00 14.00 15.00 16.00 17.00 18.00 19.00
20.00 21.00 22.00 23.00 24.00 25.00 26.00 27.00 28.00 29.00
30.00 31.00 32.00 33.00 34.00 35.00 36.00 37.00 38.00 39.00
40.00 41.00 42.00 43.00 44.00 45.00 46.00 47.00 48.00 49.00
# New slice
50.00 51.00 52.00 53.00 54.00 55.00 56.00 57.00 58.00 59.00
60.00 61.00 62.00 63.00 64.00 65.00 66.00 67.00 68.00 69.00
70.00 71.00 72.00 73.00 74.00 75.00 76.00 77.00 78.00 79.00
80.00 81.00 82.00 83.00 84.00 85.00 86.00 87.00 88.00 89.00
90.00 91.00 92.00 93.00 94.00 95.00 96.00 97.00 98.00 99.00
# New slice
100.00 101.00 102.00 103.00 104.00 105.00 106.00 107.00 108.00 109.00
110.00 111.00 112.00 113.00 114.00 115.00 116.00 117.00 118.00 119.00
120.00 121.00 122.00 123.00 124.00 125.00 126.00 127.00 128.00 129.00
130.00 131.00 132.00 133.00 134.00 135.00 136.00 137.00 138.00 139.00
140.00 141.00 142.00 143.00 144.00 145.00 146.00 147.00 148.00 149.00
# New slice
150.00 151.00 152.00 153.00 154.00 155.00 156.00 157.00 158.00 159.00
160.00 161.00 162.00 163.00 164.00 165.00 166.00 167.00 168.00 169.00
170.00 171.00 172.00 173.00 174.00 175.00 176.00 177.00 178.00 179.00
180.00 181.00 182.00 183.00 184.00 185.00 186.00 187.00 188.00 189.00
190.00 191.00 192.00 193.00 194.00 195.00 196.00 197.00 198.00 199.00
# New slice
回读的是很容易的,只要我们知道原来阵列的形状。我们可以做numpy.loadtxt('test.txt').reshape((4,5,10))
。作为一个例子(你可以在同一行做到这一点,我只是详细的澄清事情):
# Read the array from disk
new_data = np.loadtxt('test.txt')
# Note that this returned a 2D array!
print new_data.shape
# However, going back to 3D is easy if we know the
# original shape of the array
new_data = new_data.reshape((4,5,10))
# Just to check that they're the same...
assert np.all(new_data == data)
对不起,在发布我的答案后重新阅读您的问题,并怀疑它不符合您的需求 - 如果没有,请将我平复,然后发布替代方案。 (很高兴在前四分之一btw的这部分看到你) – 2010-09-10 14:20:23
其实 - 看起来像乔金顿的答案应该为你工作。 – 2010-09-10 14:21:28