簡體   English   中英

交換numpy數組的子數組

[英]Swap subarrays of a numpy array

首先是一些背景。

我試圖用開羅(實際上是pycairo)繪制一個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)

有一段時間,看起來這只會起作用,直到我試圖繪制顏色而不僅僅是黑色文本。 事實證明兩個庫在字節順序上不一致,如下所示:

# !!! 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到屏幕的blitting之后)交換了紅色和藍色通道的圖像:-(

所以,如果我繼續使用pixbufs(我想要的話),我需要對數據進行后處理,每隔3個交換每個第1個字節。 我可以在普通的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

我只是在做夢嗎?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM