簡體   English   中英

numpy:在子矩陣中找到局部坐標

[英]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中找到相應的索引?

這是一個瘋狂的猜測,但也許會有所幫助

您不是關於AB的意思,但我猜它們是用於索引的。 由於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.

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