我不喜欢增量增长阵列,但有一种方法可以做到:import numpy as np
def grow_table():
dt=np.dtype({'names':['A','B','C'],'formats':['i','i','d']})
S = np.zeros(0, dtype=dt)
for i in range(5):
X = np.array((i, 2*i, i+.5), dtype=dt)
S = np.hstack((S, X))
return S
if __name__ == '__main__':
S = grow_table()
print S
print S['A']
制作:
^{pr2}$
S以形状(0,)开头。X有形状();它是0d。最后S有形状{}。我们必须使用hstack,因为我们正在创建一个1d数组;一个元组数组。这就是你用这样的dtype得到的结果。同样,当像这样给数组赋值时,这些值需要在元组中,而不是在列表中。在
更好的增量构建是:def make_table(N=5):
dt=np.dtype({'names':['A','B','C'],'formats':['i','i','d']})
S = np.zeros(N, dtype=dt)
for i in range(N):
S[i] = (i, 2*i, i+.5)
return S
甚至使用元组列表:def better(N=5):
dt=np.dtype({'names':['A','B','C'],'formats':['i','i','d']})
L = [(i, 2*i, i+.5) for i in range(N)]
return np.array(L, dtype=dt)
对于csv输出:S = better()
np.savetxt('S.txt', S, fmt='%d, %d, %f')
产生:0, 0, 0.500000
1, 2, 1.500000
...
尝试savetxt一个(N,1)数组会产生一个或多个错误。在
savetxt试图写入for row in S:
write(fmt%row)
对于(N,)数组,row是(0, 0, 0.5),但是对于(N,1),它是{}。在
^{8}$
工作,生产(0, 0, 0.5)
(1, 2, 1.5)
...
但是如果您只想保存两列int和一个float,就不需要这个dtype。只需让fmt完成所有工作:def simple(N=5):
return np.array([(i, 2*i, i+.5) for i in range(N)])
S = simple()
np.savetxt('S.txt',S, fmt='%d, %d, %f')