import numpy
import pickle
import pygame
surface = pygame.Surface((100, 100))
获取像素,转换为 RGBA。使用 Joe Kington 的提醒,数据范围从 -1 到 1:
base = (pickle.load(open("g.pickle"))+1)/2 * 255
base = base[..., numpy.newaxis].repeat(4, -1).astype("uint8")
复制数据
numpy_surface = numpy.frombuffer(surface.get_buffer())
numpy_surface[...] = numpy.frombuffer(base)
del numpy_surface
显示它:
screen = pygame.display.set_mode((100, 100))
screen.blit(surface, (0, 0))
pygame.display.flip()
你得到

再次感谢乔金顿的输入,简化了,使用make_surface:
import numpy
import pickle
import pygame
base = (pickle.load(open("g.pickle"))+1) * 128
base = base[..., None].repeat(3, -1).astype("uint8")
surface = pygame.surfarray.make_surface(base)
screen = pygame.display.set_mode((100, 100))
screen.blit(surface, (0, 0))
pygame.display.flip()
base[..., None]通常拼写为base[..., numpy.newaxis],但看到这是我只是“扩展常量”以便不需要的唯一numpy实例numpy。但是,它不起作用,因为如果您不numpy使用IndexError: bytes to write exceed buffer size. 谢谢,numpy。
...表示“此点之前的所有轴的整体”,因此您可以替换[3:2],[:, 3:2]和。实际上,正是出于这个原因才被引入 Python。[:, :, :, 3:2][..., 3:2]...
,None或numpy.newaxis, 切片一个新的轴 (duh)。例如,这将转换[a, b, c]为[[a], [b], [c]]。这是必要的,因为我们随后repeat沿着这个新轴。
基本上,看一排,我们有
114, 202, 143, ...
我们想要
[114, 114, 114], [202, 202, 202], [143, 143, 143], ...
所以我们[..., None]让我们
[114], [202], [143], ...
我们只是repeat 3在轴上的时间-1。当然, Axis-1是最后一个轴,即numpy.newaxis.