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