Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将多维numpy数组写入csv_Python_Csv_Numpy - Fatal编程技术网

Python 将多维numpy数组写入csv

Python 将多维numpy数组写入csv,python,csv,numpy,Python,Csv,Numpy,我有一个包含函数值的多维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)) # Con

我有一个包含函数值的多维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-by-y-by-z数组,其中包含函数值f(x,y,z)。换句话说,f[i,j,k]包含对应于x[i],y[j]和z[k]的函数值f。有没有更干净的方法来编写包含x、y、z、f列的长csv

以下是head 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")

我是在重新发明轮子吗?

事实上,是的,它比它应该是的稍微复杂一些

给定3个列表x、y和z

将numpy导入为np
x=[1,2,3]
y=[4,5]
z=[6,7,8]
您需要修改此列表以获得所有可能的组合,请使用
numpy。以这种方式重复

new_x=np.数组(x).重复(len(y)*len(z))
打印新的
>> [1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3]
新的y=np。数组([y])。重复(len(z),轴=0)。重复(len(x),轴=1)
打印新的
>> [4 4 4 5 5 5 4 4 4 5 5 5 4 4 4 5 5 5]
新_z=np.数组([z])。重复(len(x)*len(y),轴=0)
打印新的
>> [6 7 8 6 7 8 6 7 8 6 7 8 6 7 8 6 7 8]
#重塑y和z,就像新的x一样
新建y=新建y.整形(新建x.形状)
new_z=new_z.重塑(new_x.形状)
只需将它们连接起来!

#假设向量f
f=np.数组(范围(len(x)*len(y)*len(z)))
矩阵=np.数组([new_x,new_y,new_z,f]).T
#或者矩阵=np.连接((np.连接((新x,新y),轴=1),np.连接((新z,f,轴=1)),轴=1)
打印矩阵
>>
[[ 1  4  6  0]
[ 1  4  7  1]
[ 1  4  8  2]
[ 1  5  6  3]
[ 1  5  7  4]
[ 1  5  8  5]
[ 2  4  6  6]
[ 2  4  7  7]
[ 2  4  8  8]
[ 2  5  6  9]
[ 2  5  7 10]
[ 2  5  8 11]
[ 3  4  6 12]
[ 3  4  7 13]
[ 3  4  8 14]
[ 3  5  6 15]
[ 3  5  7 16]
[ 3  5  8 17]]
最后,将阵列另存为csv

np.savetxt('file\u name.csv',矩阵)

使用@EdChum查看示例——我认为np.savetxt不能满足我的需要。我应该传递什么参数呢?将所有数组连接在一起,然后使用
savetxt
一次性写出它会更容易。我会这么做的personally@EdChum看编辑,这就是你的想法吗?我想这可能是最好的方法