将3d数组中的特定列复制到2d数组[Python / Pygame]

时间:2017-06-19 15:36:52

标签: python arrays numpy pygame

所以我有这个由 pygame.surfarray.array3d(image)创建的3d数组,它给我一个索引数组作为[width] [height]和第三维有RGB值(R ,G,B)

像这样:array [x] [y] =(0,255,167)

现在,我想将每个RGB列放入一个新的2d数组中(例如,我想创建一个只有R列值的新Red [x] [y]数组,一个新的Green [x] [y]数组只有G列值和一个新的Blue [x] [y]数组,只有B列值)。

它看起来就像这样(在这个例子中我只显示一个值,但我希望这些Red Green和Blue是数组):

红色[x] [y] = 0

绿色[x] [y] = 255

蓝色[x] [y] = 167

我已经尝试将数组[:,0]用于红色,数组[:,1]用于绿色,数组[:,2]用于蓝色但是它不起作用 - 我的猜测是因为这个数组不是一个numpy数组。

非常欢迎任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

pygame.surfarray.array3d(image)将返回一个numpy数组的维度 width x height x 3 (其中 3 是三个颜色分量RGB)。您可以使用:访问维度中的所有元素和整数来访问特定索引处的元素。

例如,要访问图像中的颜色,请为红色array[:, :, 0]写入,蓝色为array[:, :, 1],绿色为array[:, :, 2]。要访问第16行的蓝色,请编写array[:, 16, 1]

如果排除对维度建立索引,则会假定您需要该维度中的所有元素。例如,array[:, :]array[:, :, :]相同,array[4]array[4, :, :]相同。

这是一个简短的例子来回答你的问题。

import pygame
pygame.init()

image = pygame.Surface((4, 4))
image.fill((255, 128, 32))

array = pygame.surfarray.array3d(image)

red_array   = array[:, :, 0]  # These will now be a 2D-array since we're extracting
green_array = array[:, :, 1]  # only one value from the third dimension.
blue_array  = array[:, :, 2]

print('Red array: ')
print(red_array)
print('Green array: ')
print(green_array)
print('Blue Array: ')
print(blue_array)

答案 1 :(得分:0)

您可能只想使用循环遍历2D数组的常规方法。

red,green,blue = ([[0]*len(array[0]) for i in range(len(array)),)*3
for i in range(len(array)):
    for j in range(len(array[i])):
        red[i][j],green[i][j],blue[i][j] = array[i][j]