Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 交换numpy阵列的子阵列_Python_Numpy_Pygtk_Pycairo - Fatal编程技术网

Python 交换numpy阵列的子阵列

Python 交换numpy阵列的子阵列,python,numpy,pygtk,pycairo,Python,Numpy,Pygtk,Pycairo,首先是一点背景知识 我正试着用Cairo画一个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.Con

首先是一点背景知识

我正试着用Cairo画一个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)
a = np.frombuffer(data, dtype=np.uint8)
a.shape = (len(data) / 4, 4)
temp = a[:,0]
a[:,0] = a[:,2]
a[:,2] = temp
有一段时间,这看起来很有效,直到我试着画画 颜色,而不仅仅是黑色文本。事实证明,这两个图书馆在这方面存在分歧 字节顺序,如下所示:

# !!! 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 !!!

我只是在做梦吗?

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

是的,我发现这是我自己通过尝试错误和经历类似问题的组合。谢谢你!对我来说,REQUESTED=a[:,:,[2,1,0,3]]在没有附加形状命令的情况下工作,
REQUESTED=a[…,[2,1,0,3]
应该适用于任意数量的轴(例如,批量学习或类似的傻事)。
a = np.frombuffer(data, dtype=np.uint8)
a.shape = (-1, 4)
rearranged = a[:,[2,1,0,3]]