簡體   English   中英

numpy ndarray 索引 - 從元組中檢索索引

[英]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_是構建此類元組的好方法)。

我想我可以從Matsub信息推斷出這種切片,例如

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)獲取所有索引讓我有點煩惱。 meshgridmgrid可以工作,但它們需要生成范圍。 我無法立即想到一個具有形狀並給出相應I,J的函數。

I,J=np.array(list(np.ndindex(sub.shape))).T

會做,但不漂亮。

暫無
暫無

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

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