枚举 numpy 中的二维数组并追加到新数组

Enumerate through 2D array in numpy and append to new array

我正在尝试枚举形状为 (512, 512) 的 2D numpy 数组,它保存图像的像素值。所以基本上它是一个数组,表示图像像素值的宽度和高度。我正在尝试枚举每个元素以输出:[y_index、x_index、pixel_value]。我需要将这 3 个输出值存储在一个数组中(现有的或新的,以执行效率更高者为准)。 所以输入数组的形状为 (512, 512),如果我没记错的话,输出数组的形状为 (262144, 3)。 262144 是 512x512 矩阵中的像素总数。而 3 因为有 3 列,对于我需要提取的 3 条数据:pixel valuey coordinatex coordinate。所以基本上我想要一个像素值数组及其 y、x 坐标。

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

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})

您可以使用 numpy.indices 来做到这一点。您最终想要的是 image_datayx 索引和相应的像素 (px)。 image_data.

中有三列
row, col = np.indices(img.shape)
y, x, px = row.flatten(), col.flatten(), img.flatten()
image_data = np.array([y, x, px]).T

详细示例:

img = np.arange(20).reshape(5, 4)

def process_image_data(img):
    row, col = np.indices(img.shape)
    return (row.flatten(), col.flatten(), img.flatten())

y, x, px = process_image_data(img)