簡體   English   中英

從矩陣中獲取向量和 numpy 中的索引向量

[英]get a vector from a matrix and a vactor of index in numpy

我有一個矩陣m = [[1,2,3],[4,5,6],[7,8,9]]和一個包含行索引的向量v=[1,2,0]我想為矩陣的每一列返回。

我期望的結果應該是r=[4,8,3] ,但我不知道如何使用 numpy 獲得這個結果。

通過將向量應用於索引,對於每一列,我得到: m[v,[0,1,2]] = [4, 8, 3] ,這大致是我的追求。

為了防止對列進行硬編碼,我使用np.arange(m.shape[1])並且我的最終公式看起來像r=m[v,np.arange(m.shape[1])]

這對我來說聽起來很奇怪,對於應該很常見的事情來說有點復雜。

有沒有一種干凈的方法來獲得這樣的結果?

In [157]: m = np.array([[1,2,3],[4,5,6],[7,8,9]]);v=np.array([1,2,0])
In [158]: m
Out[158]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
In [159]: v
Out[159]: array([1, 2, 0])
In [160]: m[v,np.arange(3)]
Out[160]: array([4, 8, 3])

我們選擇 3 個元素,索引為 (1,0),(2,1),(0,2)。

更接近 MATLAB 方法:

In [162]: np.ravel_multi_index((v,np.arange(3)),(3,3))
Out[162]: array([3, 7, 2])
In [163]: m.flat[_]
Out[163]: array([4, 8, 3])

八度/MATLAB等效

>> m = [1 2 3;4 5 6;7 8 9];
>> v = [2 3 1]
v =

   2   3   1

>> m = [1 2 3;4 5 6;7 8 9];
>> v = [2 3 1];
>> sub2ind([3,3],v,[1 2 3])
ans =

   2   6   7

>> m(sub2ind([3,3],v,[1 2 3]))
ans =

   4   8   3

相同的broadcasting用於訪問塊,如最近的這個問題所示:

Python 有沒有辦法像 Matlab 一樣獲得子矩陣?

好吧,在Integer array andexing的文檔中,這個“奇怪/復雜”的事情實際上被稱為“直截了當”的場景,這是更廣泛的“高級索引”主題下的子主題。

引用一些摘錄:

當索引由與被索引的數組具有維度一樣多的 integer arrays 組成時,索引是直截了當的,但與切片不同。 高級索引始終作為一個廣播和迭代。 請注意,結果形狀與(廣播)索引數組形狀相同

如果它看起來不那么復雜/奇怪,您可以使用range(m.shape[1])而不是np.arange(m.shape[1]) 它只需要是任何數組或類似數組的結構。

可視化/直覺:

當我學習這個(整數數組索引)時,它幫助我通過以下方式可視化事物:

我想象索引 arrays 並排站立,都具有完全相同的形狀(可能是一起廣播的結果)。 我還可視化了結果數組,它也具有與索引 arrays 相同的形狀。 在每個索引 arrays 和結果數組中,我想象了一只猴子,它能夠遍歷自己的數組,跳到自己數組的連續元素。 請注意,通常,索引 arrays 和結果數組的這種相同形狀可以是 n 維的,並且這種相同的形狀可能與其值實際被索引的源數組的形狀非常不同。

在您自己的示例中,源數組m的形狀為(3,3) ,索引 arrays 和結果數組的形狀均為(3,)

在您的示例中,這三個 arrays (兩個索引 arrays 和結果數組)中的每一個都有一只猴子。 然后,我們想象猴子串聯地遍歷它們各自的數組元素。 這里,“串聯”意味着所有三只猴子都從它們各自的 arrays 的第一個元素開始,每當一只猴子跳到自己數組的下一個元素時,另一個 arrays 中的其他猴子也會跳到它們的下一個元素相應的 arrays。 當它跳到每個連續的元素時,每個索引數組中的猴子都會調用它剛剛訪問過的元素的值。 於是兩個索引arrays中的兩只猴子讀出了它們剛剛訪問過的值,在它們各自的索引arrays中。 結果數組中的猴子也與索引 arrays 中的猴子一起跳躍。 它聽到猴子在索引 arrays 中調用的值,將這些值用作源數組m的索引,從而確定要從源數組m中選取的值。 結果數組中的猴子從源數組m中獲取該值,並將該值存儲在結果數組中,它剛剛跳到的位置。 因此,例如,當所有三只猴子都在它們各自的 arrays 的第二個元素中時,結果數組的第二個 position 將確定其值。

正如numpy 文檔所述,我認為您提到的方式是執行此任務的標准方式:

例子
應從每一行中選擇一個特定元素。 行索引只是 [0, 1, 2],列索引指定要為相應行選擇的元素,這里是 [0, 1, 0]。 將兩者結合使用,可以使用高級索引來解決任務:

x = np.array([[1, 2], [3, 4], [5, 6]])
x[[0, 1, 2], [0, 1, 0]]

暫無
暫無

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

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