[英]Elegant way to check co-ordinates of a 2D NumPy array lie within a certain range
[英]Numpy: find local co-ordinates within a submatrix
假設我們有一個4x4矩陣:
A = [[1,2]
[3,4]]
我們定義另一個矩陣:
C* = [[ 8, 4, 2, 4],
6, 2, 6, 8],
4, 2, 6, 4],
6, 8, 2, 8]]]
接下來,我們將C **定義為每個2x2塊的最小值矩陣:
C** = [[2, 2],
[2, 2]]
我們定義C **和A之間的對應關系:1.將C **中單元格的值定位到C *中相應的2x2塊。 2.該子塊的索引為A的索引,並且該子塊中最小值的位置為A中的對應位置。
如何有效地在A中找到相應的索引?
這是一個瘋狂的猜測,但也許會有所幫助
您不是關於A
和B
的意思,但我猜它們是用於索引的。 由於numpy
是0的基數,因此請更改為:
In [2010]: B=np.arange(4).reshape(2,2)
In [2011]: B
Out[2011]:
array([[0, 1],
[2, 3]])
所以這是您的C
,您想使用2x2子矩陣
In [2012]: C
Out[2012]:
array([[8, 4, 2, 4],
[6, 2, 6, 8],
[4, 2, 6, 4],
[6, 8, 2, 8]])
重塑會產生4個2x2陣列,但是分組是錯誤的
In [2013]: C.reshape(2,2,2,2)
Out[2013]:
array([[[[8, 4],
[2, 4]],
[[6, 2],
[6, 8]]],
[[[4, 2],
[6, 4]],
[[6, 8],
[2, 8]]]])
但是2軸的轉置可以給出正確的子數組
In [2014]: C1=C.reshape(2,2,2,2).transpose(0,2,1,3)
In [2015]: C1
Out[2015]:
array([[[[8, 4],
[6, 2]],
[[2, 4],
[6, 8]]],
[[[4, 2],
[6, 8]],
[[6, 4],
[2, 8]]]])
通過重塑為4x4來簡化事情; 所以每一行都是你的子數組
In [2016]: C2=C1.reshape(4,4)
In [2017]: C2
Out[2017]:
array([[8, 4, 6, 2],
[2, 4, 6, 8],
[4, 2, 6, 8],
[6, 4, 2, 8]])
現在我們可以在每一行中查找最小值:
In [2018]: np.argmin(C2,axis=1)
Out[2018]: array([3, 0, 1, 2], dtype=int32)
因此最小值是:
In [2020]: C2[[0,1,2,3],[3,0,1,2]]
Out[2020]: array([2, 2, 2, 2])
[0,1,2,3]
看起來像是一個展平的B
; 和[3,0,1,2]
看起來像是重新排序的A
====================
在您最初的問題中,您有A *和B *,它們可以用圖塊和克朗構造。 應用相同的重塑:
In [2029]: B
Out[2029]:
array([[0, 1],
[2, 3]])
In [2030]: np.kron(B,np.ones((2,2),int)) # your B*
Out[2030]:
array([[0, 0, 1, 1],
[0, 0, 1, 1],
[2, 2, 3, 3],
[2, 2, 3, 3]])
In [2031]: np.kron(B,np.ones((2,2),int)).reshape(2,2,2,2).transpose(0,2,1,3).reshape(4,4)
Out[2031]:
array([[0, 0, 0, 0],
[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]])
In [2032]: np.tile(B,(2,2)).reshape(2,2,2,2).transpose(0,2,1,3).reshape(4,4)
Out[2032]:
array([[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3]])
因此,您的B *和A *映射到我的轉置數組的行和列。
=====================
C2 argmin可以使用unravel_index
表示為2x2數組中的坐標:
In [2085]: idx=np.argmin(C2,axis=1)
In [2086]: idx
Out[2086]: array([3, 0, 1, 2], dtype=int32)
In [2094]: idx1=np.unravel_index(idx,(2,2))
In [2095]: idx1
Out[2095]: (array([1, 0, 0, 1], dtype=int32), array([1, 0, 1, 0], dtype=int32))
In [2096]: np.transpose(idx1)
Out[2096]:
array([[1, 1],
[0, 0],
[0, 1],
[1, 0]], dtype=int32)
將該“本地”索引應用於C1數組
In [2097]: C1.reshape(4,2,2)[np.arange(4), idx1[0], idx1[1]]
Out[2097]: array([2, 2, 2, 2])
或沒有重塑
In [2100]: idx2=np.unravel_index(np.arange(4),(2,2))
In [2101]: C1[idx2[0],idx2[1], idx1[0], idx1[1]]
Out[2101]: array([2, 2, 2, 2])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.