[英]numpy ndarray indexing - retrieving indexes from tuple
我之前問過一個類似的問題,但我仍然不完全確定 numpy 如何組織其索引。
我正在處理許多 3D 數組,所有數組的大小都相同。 由於以后的操作(使用 scipy 和其他人查看窗口),我需要對我正在執行的一系列操作進行切片,如下所示:
imFrag.append(Padded[:100, :100, :100)
它將數組分成 8 個部分。 我正在嘗試獲取每個切片的原始索引。 我可以使用以下方法對整個 3d 數組執行此操作:
np.where(Mat == Mat)
這給了我一個包含 x、y 和 z 分量的元組。 有沒有辦法做到這一點?
謝謝!
考慮存儲切片對象而不是碎片本身
your_slice = np.s_[:100, :100, :100]
只是為了得到圖像
Padded[your_slice]
獲取用於創建切片的索引
your_slice[0].start
your_slice[0].step
your_slice[0].stop
對於您關心的任何維度
讓我們嘗試一些小的和 2d 的東西:
In [102]: Mat = np.arange(16).reshape(4,4)
In [103]: sub = Mat[2:,:2]
In [104]: Mat
Out[104]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In [105]: sub
Out[105]:
array([[ 8, 9],
[12, 13]])
你想知道如何判斷sub
發生在Mat
嗎?
在一般實踐中,最好的辦法是堅持索引元組
In [106]: ind=(slice(2,None),slice(None,2))
In [107]: Mat[ind]
Out[107]:
array([[ 8, 9],
[12, 13]])
In [108]: Mat[ind] += sub # duplicate the sub values
In [109]: Mat
Out[109]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[16, 18, 10, 11],
[24, 26, 14, 15]])
(如果您更喜歡冒號語法, np.s_
是構建此類元組的好方法)。
我想我可以從Mat
和sub
信息推斷出這種切片,例如
In [120]: Mat.__array_interface__['data'][0],Mat.shape,Mat.strides,Mat.itemsize
Out[120]: (169022104, (4, 4), (16, 4), 4)
In [121]: sub.__array_interface__['data'][0],sub.shape,sub.strides
Out[121]: (169022136, (2, 2), (16, 4))
但它需要對數據的存儲和訪問方式有一定的了解。 對於像這樣的簡單切片不應該太難。 對於更一般的,例如帶有步驟和轉置的,會更難。
但我從來不需要這樣做。 保留原始切片元組更容易。 如果您進行高級索引(創建副本而不是視圖),則堅持索引或屏蔽是唯一的方法。
======================
關注你的評論:
In [140]: I,J=np.where(sub==sub)
In [141]: ind
Out[141]: (slice(2, None, None), slice(None, 2, None))
In [142]: Mat[2+I,0+J] # 0 inplace of None for J
Out[142]: array([16, 18, 24, 26])
所以是的,您可以使用sub
索引來查找Mat
相應元素。 使用where(sub==sub)
獲取所有索引讓我有點煩惱。 meshgrid
和mgrid
可以工作,但它們需要生成范圍。 我無法立即想到一個具有形狀並給出相應I,J
的函數。
I,J=np.array(list(np.ndindex(sub.shape))).T
會做,但不漂亮。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.