【问题标题】:Swap subarrays of a numpy array交换numpy数组的子数组
【发布时间】:2012-09-23 20:34:55
【问题描述】:

首先介绍一下上下文。

我正在尝试使用 Cairo 绘制 Gdk(实际上是 pygtk)pixbuf (实际上是pycairo)。我的原始代码如下所示:

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)

有一段时间,它看起来像这样可以工作,直到我尝试画画 颜色,而不仅仅是黑色文本。事实证明这两个库不同意 字节顺序,像这样:

# !!! FIXME !!! cairo ARGB surfaces and gdk pixbufs disagree on bytesex:
# cairo: LSB --> B G R A <-- MSB
# gdk:   LSB --> R G B A <-- MSB
# !!! WTF !!!

结果是(从 pixbuf 传送到屏幕后)一个图像 红色和蓝色通道交换:-(

所以,如果我继续使用 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

我只是在做梦吗?

【问题讨论】:

    标签: python numpy pygtk pycairo


    【解决方案1】:

    注意 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]]
    

    【讨论】:

    • 是的,我自己通过试错和在这里遇到的类似问题找到了这个。不过谢谢!
    • 对我来说重新排列 = a[:,:,[2,1,0,3]] 没有额外的形状命令
    • 另外,rearranged = a[...,[2,1,0,3]] 应该适用于任意数量的轴(例如,批量学习或类似的傻事)。
    猜你喜欢
    • 1970-01-01
    • 2013-02-02
    • 2014-07-19
    • 2011-06-18
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多