我試圖將2D ndarray視圖作爲記錄或結構化陣列進行復制。這似乎很好地工作,如果a
擁有它的數據獲取ndarray的重新陣列視圖(也可以是視圖)
>>> a = np.array([[ 1, 391, 14, 26],
[ 17, 371, 15, 30],
[641, 340, 4, 7]])
>>> b = a.view(zip('abcd',[a.dtype]*4))
array([[(1, 391, 14, 26)],
[(17, 371, 15, 30)],
[(641, 340, 4, 7)]],
dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8'), ('d', '<i8')])
>>> b.base is a
True
但如果a
已經是一個視圖,這個失敗。這裏有一個例子
>>> b = a[:,[0,2,1,3]]
>>> b.base is None
False
>>> b.view(zip('abcd',[a.dtype]*4))
ValueError: new type not compatible with array.
有趣的是,在這種情況下b.base
是視圖
>>> (b.base == b.T).all()
True
的轉置因此它是有道理的numpy的無法創建的那個我想要的視圖。
但是,如果我用
>>> b = np.take(a,[0,2,1,3],axis=1)
這導致b
是數據的正確副本,以便採取recarray觀點的作品。側面問題:有人可以解釋這種行爲與花式索引相反嗎?
我的問題是,我這樣做是錯誤的嗎?正在考慮我不支持的方式嗎?如果是這樣,那麼正確的做法是什麼?
謝謝!我不知道內存佈局可能會這樣改變。清楚的是,我知道索引像'a [:,[0,2,1,3]'會返回一個副本,但我不知道它可能是'F_CONTIGOUS'或'np.take'會總是返回一個'C_CONTIGUOUS'(這個numpy文檔說''np.take'與花式索引做同樣的事情,這在這個例子中似乎是錯誤的)。你會如何處理這種特殊的觀點(沒有複製),並且始終有效?檢查數組是否爲'F \ C_CONTIGOUS'是不好的做法嗎? – toes