Каждый элемент в массиве, возвращаемый pygame.surfarray.pixels2d
, представляет собой число, полученное путем упаковки трех каналов в одно целое число, и я не знаю простого способа воспользоваться преимуществами структуры массива для быстрого и простого умножение с этим.
Тем не менее, я все еще думаю, что вам лучше всего использовать pygame.surfarray.pixels3d
, а не numpy.tile
. Вы могли бы сделать что-то вроде этого:
screen_array = pygame.surfarray.pixels3d(self.screen)
noise_small = numpy.random.random((self.width/4,self.height/4)) * 0.2 + 0.4
noise_big = noise_small .repeat(4, 0).repeat(4, 1)
screen_array *= noise_big[:, :, numpy.newaxis]
Обратите внимание на [:, :, numpy.newaxis]
. Это преобразует noise_big
в форму (X, Y, 1)
вместо (X, Y), что позволяет прямое умножение с объектом screen_array
, имеющим форму (X, Y, 3)
. Когда это происходит, один элемент третьей оси умножается на все 3 канала. Этот способ решения проблемы более эффективен, чем использование numpy.tile
.