如果保存文件需要是“csv”样式的文本,则可以使用多个savetxt和loadtxt。关键是要知道这两个都可以
以打开的文件作为输入。
写作示例:In [31]: A=np.arange(3*2*4).reshape(3,2,4)
In [32]: A # normal display as 3 blocks of 2d array
Out[32]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])
In [36]: for a in A:print a, '\n' # or iterate on the 1st dimension
[[0 1 2 3]
[4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]
[[16 17 18 19]
[20 21 22 23]]
在这个例子之后,我可以迭代文件,对每个子数组使用savetxt:In [37]: with open('3dcsv.txt','wb') as f:
for a in A:
np.savetxt(f, a, fmt='%10d')
f.write('\n')
....:
用系统cat(通过ipython)确认文件写入:In [38]: cat 3dcsv.txt
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
16 17 18 19
20 21 22 23
对于简单读取,loadtxt显然忽略空行,返回一个6x 4数组。所以我知道应该是(2,3,4)我可以很容易地重塑结果。In [39]: np.loadtxt('3dcsv.txt')
Out[39]:
array([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[ 12., 13., 14., 15.],
[ 16., 17., 18., 19.],
[ 20., 21., 22., 23.]])
经过一点调试,我得到了这个多loadtxt工作。loadtxt(和genfromtxt)使用行列表。In [53]: A1=[] # list to collect blocks
In [54]: with open('3dcsv.txt') as f:
lines = [] # list to collect lines
while 1:
aline = f.readline()
if aline.strip():
lines.append(aline) # nonempty line
else: # empty line
if len(lines)==0: break
A1.append(np.loadtxt(lines, dtype=int))
lines = []
....:
In [55]: A1 = np.array(A1)
In [56]: A1
Out[56]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])
这可能不是save/load中最健壮的一对,但它为构建更好的架构提供了框架。
但是如果它不需要是文本,那么pickle就可以了,就像本地的numpy“save/load”一样In [57]: np.save('3dsave.npy',A)
In [58]: np.load('3dsave.npy')
Out[58]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])