【发布时间】:2015-08-07 19:39:30
【问题描述】:
我有一个包含函数值的多维 numpy 数组,我想将它写入一个长 csv。我怎样才能干净地做到这一点?我找不到 numpy 函数,但也许我在谷歌上搜索了错误的术语。一个例子:
#!/usr/bin/python
import csv
import numpy as np
x = np.array([1, 2, 3, 4])
y = np.array([50, 51])
z = np.array([99, 100, 101])
f = np.arange(24).reshape((4, 2, 3)) # Contains f(x, y, z)
assert f.shape == (x.size, y.size, z.size)
## I'd like to create a csv file whose columns are x, y, z, f
## How can I do that?
## np.savetxt("test.csv", a, delimiter=",")
## TypeError: float argument required, not numpy.ndarray
## Works, but does numpy already have a function that does this?
with open("test.csv", "wb") as csvfile:
writer = csv.writer(csvfile, delimiter=",", quotechar="'", quoting=csv.QUOTE_MINIMAL)
writer.writerow(["x", "y", "z", "f"])
for x_index in range(x.size):
for y_index in range(y.size):
for z_index in range(z.size):
writer.writerow([x[x_index], y[y_index], z[z_index],
f[x_index, y_index, z_index]])
我有三个向量 x、y、z 和一个 X×Y×Z 数组,其中包含函数值 f(x,y,z)。换言之,f[i, j, k] 包含对应于 x[i], y[j] 和 z[k] 的函数值 f。有没有更简洁的方法来编写包含 x、y、z、f 列的长 csv?
这是头部 test.csv:
x,y,z,f
1,50,99,0
1,50,100,1
1,50,101,2
1,51,99,3
1,51,100,4
1,51,101,5
2,50,99,6
2,50,100,7
2,50,101,8
编辑:这似乎也有效:
x_y_z = np.array([x for x in itertools.product(x, y, z)])
assert x_y_z.shape[0] == f.size
output_array = np.hstack((x_y_z, f.flatten().reshape((f.size, 1)))
np.savetxt("test2.csv", output_array, comments="", delimiter=",", fmt="%i",
header="x,y,z,f")
我是在重新发明轮子吗?
【问题讨论】:
-
@EdChum 看这个例子——我不认为 np.savetxt 做我想要的。我应该传递什么参数给它?
-
将所有数组连接在一起并使用
savetxt一次性写出来会更容易,我会亲自这样做 -
@EdChum 看到编辑,这是你的想法吗?
-
我认为这可能是最好的方法