Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.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中的2D数组并附加到新数组_Python_Arrays_Numpy_Enumeration_Numpy Ndarray - Fatal编程技术网

Python 枚举numpy中的2D数组并附加到新数组

Python 枚举numpy中的2D数组并附加到新数组,python,arrays,numpy,enumeration,numpy-ndarray,Python,Arrays,Numpy,Enumeration,Numpy Ndarray,我试图枚举一个形状(512512)的2D numpy数组,它保存图像的像素值。基本上,它是一个数组,用像素值表示图像的宽度和高度。我试图枚举每个元素以输出:[y_索引,x_索引,像素值]。我需要将这3个输出值存储在一个数组中(现有值或新值,以执行效率较高的为准)。 所以输入数组的形状是(512,512),如果我没弄错的话,输出数组的形状是(262144,3)。262144是512x512矩阵中的像素总数。因为有3列,我需要提取3个数据:像素值,y坐标,x坐标。基本上我想要一个像素值数组和它们的y

我试图枚举一个形状(512512)的2D numpy数组,它保存图像的像素值。基本上,它是一个数组,用像素值表示图像的宽度和高度。我试图枚举每个元素以输出:[y_索引,x_索引,像素值]。我需要将这3个输出值存储在一个数组中(现有值或新值,以执行效率较高的为准)。 所以输入数组的形状是(512,512),如果我没弄错的话,输出数组的形状是(262144,3)。262144是512x512矩阵中的像素总数。因为有3列,我需要提取3个数据:
像素值
y坐标
x坐标
。基本上我想要一个像素值数组和它们的y,x坐标

在下面的代码中,我使用
ndenumerate
枚举像素值的numpy数组(
img
)。但我正在努力研究如何将输出值存储在数组中。我创建了
坐标
数组来存储输出值,但最后一行的尝试显然不正确,无法达到预期效果。那么如何解决这个问题呢

img = as_np_array[:, :, 0]
img = img.reshape(512, 512)
coordinates = np.empty([262,144, 3])
for index, x in np.ndenumerate(img):
    coordinates = np.append(coordinates, [[x], index[0], index[1]])
另外,我面临的另一个挑战是,要执行这段代码,我的Intel Core i7 2.7GHz(4核)处理器需要大约7-10分钟(有时可能更多)才能执行。是否有更高效的代码可以执行得更快


非常感谢您的帮助。

我的解决方案是:

with open('img_pixel_coor1.csv', 'w', newline='') as f:
    headernames = ['y_coord', 'x_coord', 'pixel_value']
    thewriter = csv.DictWriter(f, fieldnames=headernames)
    thewriter.writeheader()     
    for index, pix in np.ndenumerate(img):
        thewriter.writerow({'y_coord' : index[0], 'x_coord' : index[1], 'pixel_value' : pix})
你可以这样做。您最终需要的是具有
y
x
索引和相应像素(
px
)的
image\u数据。
image\u数据中有三列

行,列=np.索引(img.形状)
y、 x,px=行.展平(),列.展平(),img.展平()
image_data=np.数组([y,x,px]).T
详细示例:
img=np.arange(20).重塑(5,4)
def过程图像数据(img):
行,列=np.索引(img.形状)
返回(row.flatte()、col.flatte()、img.flatte())
y、 x,px=处理图像数据(img)

像素值、x坐标和y坐标不能使用三个变量。在这种情况下,您可以使用现有数组,并且
ycoord,xcoord=numpy.mgrid[0:img.shape[0],0:img.shape[1]
。感谢您的回复。对不起,我不明白你的回答格式。基本上,我需要一个具有3列的数组输出:
像素值
,及其
x
&
y
坐标。我之所以特别需要这种格式,是因为我需要将其保存为CSV文件,以获得特定的数据格式/结构。您有
ycoord
xcoord
,但我需要在一个数组中输出所有内容。不一定:您还可以在x坐标和y坐标上创建一个双循环,然后将一行x、y、pixel_值输出到CSV文件。在这种情况下,您既不需要这么大的2D数组,也不需要我的解决方案,只需要对范围内的x(512)进行
:对范围内的y(512)进行
:csv.write(x,y,img[y,x])
。非常感谢您的建议。我现在只是在尝试这个代码。我用一个小数组示例来测试这段代码:
array2=np.array([[1,1,1],[2,2,2],[3,3,3]]),并将open('csv_test.csv','w',newline='')作为f:writer=csv.writer(f)the writer.writerow(['x_-coord','y_-coord','pixel_-value'])表示np.nditer(y):表示x在np.nditer(y):表示writer.writerow([x,y,array2[y,x]]))
,但我得到了一个错误:
索引3超出了轴0的范围,大小为3
。不确定原因是什么?是
np.nditer
问题还是其他问题?因为
np.nditer
通过大于一个维度的扁平数组。而且,您的代码没有反映我写的内容。我通过dime数组的维度(形状);您单步遍历数组本身,并使用数组中的值对数组进行索引:
在np.nditer(array2):…array2[y,x]
。这不起作用(除非在某些非常特殊的情况下)。