交换numpy数组的子数组

2024-05-19 06:48:44 发布

您现在位置:Python中文网/ 问答频道 /正文

先说一点背景知识。在

我正试着和开罗一起加入Gdk(实际上是pygtk)pixbuf (实际上是皮卡罗)。我最初的代码是这样的:

import cairo as C
import gtk.gdk as GG

FMT = C.FORMAT_ARGB32
CSP = GG.COLORSPACE_RGB

st = C.ImageSurface.format_stride_for_width(FMT, zw)
surf = C.ImageSurface(FMT, zw, zh)
c = C.Context(surf)

# draw into c here ...

pixels = surf.get_data()
return GG.pixbuf_new_from_data(pixels, CSP, True, 8, zw, zh, st)

有一段时间,在我试着画画之前,这一切看起来还可以 颜色而不是黑色文本。结果两个图书馆意见不一致 字节顺序,如下所示:

^{pr2}$

结果是(在从pixbuf到屏幕上的blitting之后)一个带有 红色和蓝色通道交换:-(

所以,如果我继续使用pixbufs(如我所愿),我需要对数据进行后处理, 每1个字节与第3个字节交换。我可以用纯python实现:

def changesex(data):
    i0 = 0
    i2 = 2
    l = len(data)
    while i2 < l:
        temp = data[i0]
        data[i0] = data[i2]
        data[i2] = temp
        i0 += 4
        i2 += 4

但是我想如果有一个内置的,使用numpy可能会更快 运算符是用C写的,类似这样:

a = np.frombuffer(data, dtype=np.uint8)
a.shape = (len(data) / 4, 4)
temp = a[:,0]
a[:,0] = a[:,2]
a[:,2] = temp

我只是在做梦吗?在


Tags: importdata字节astempsurfcspst
1条回答
网友
1楼 · 发布于 2024-05-19 06:48:44

注意a您的初始(N,4)数组,B,G,R,A可以得到(N,4)表示为R,G,B,A,而不是简单地使用一些高级索引:

a = np.frombuffer(data, dtype=np.uint8)
a.shape = (-1, 4)
rearranged = a[:,[2,1,0,3]]

相关问题 更多 >

    热门问题