到目前为止,我已经提出了以下内容:
screen_array = pygame.surfarray.pixels2d(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
但这会在每个频道上添加单独的噪音。
我知道我也可以使用pygame.surfarray.pixels3d
然后使用numpy.tile
噪音数组,但这对我来说太慢了(好吧,我现在正在做的事情也很慢,但没关系)
答案 0 :(得分:0)
由pygame.surfarray.pixels2d
返回的数组中的每个元素是通过将3个通道打包成单个整数而获得的数字,我不知道利用数组结构快速执行的简单方法和简单的乘法。
但是,我仍然认为最好的办法是使用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
更有效。