簡體   English   中英

用Python方式將numpy數組轉換為帶有列索引的另一個數組

[英]Pythonic way to convert a numpy array into another array with column indices

因此,鑒於此輸入,我想做什么:

a=np.array([[5, 1, 10], [2, 3, 4]])

轉換為另一個np數組:

[[(5, 0), (1, 1), (10, 2)], [(2, 0), (3, 1), (4, 2)]]

什么是pythonic方式做到這一點?

編輯:我正在使用1索引但0索引也可以。 添加了更多上下文來闡明。 修復了初始化中的錯字。

列索引表示項目。 每個單元格中的值表示該項目的得分。 我想要做的是根據分數以降序對每一行進行排序,並獲取索引以進行進一步處理。

因此,如果我具有如上所述的輸出,則在排序后,它看起來像:

[[(10, 2), (5, 0), (1, 1)], [(4,2), (3, 1), (2, 0)]]

然后我可以獲取索引:

[[2, 0, 1],[2, 1, 0]]

謝謝

首先,您a表達式缺少[]

In [231]: a=np.array([[5, 1, 10], [2, 3, 4]])  # add extra []
In [232]: a
Out[232]: 
array([[ 5,  1, 10],
       [ 2,  3,  4]])

列表理解是生成所示列表的最簡單方法

In [233]: [[(n,i+1) for i,n in enumerate(row)] for row in a]
Out[233]: [[(5, 1), (1, 2), (10, 3)], [(2, 1), (3, 2), (4, 3)]]

我也可以通過串聯np.arange(1,4)來做到這一點,但是內部元素不是元組。 我必須使用結構化數組才能獲得這種顯示。

這是我們通過串聯得到的3d數組:

In [234]: np.array(_)
Out[234]: 
array([[[ 5,  1],
        [ 1,  2],
        [10,  3]],

       [[ 2,  1],
        [ 3,  2],
        [ 4,  3]]])

具有相同tolist()輸出的結構化數組:

In [244]: alist=[[(n,i+1) for i,n in enumerate(row)] for row in a]
In [245]: a3=np.array(alist, dtype='i,i')
In [246]: a3
Out[246]: 
array([[( 5, 1), ( 1, 2), (10, 3)],
       [( 2, 1), ( 3, 2), ( 4, 3)]], 
      dtype=[('f0', '<i4'), ('f1', '<i4')])

直接建造:

In [254]: a2=np.zeros((a.shape[0],a.shape[1],2),a.dtype)
In [255]: a2[:,:,0]=a
In [256]: a2[:,:,1]=np.arange(1,4)
In [257]: a2
Out[257]: 
array([[[ 5,  1],
        [ 1,  2],
        [10,  3]],

       [[ 2,  1],
        [ 3,  2],
        [ 4,  3]]])

或針對結構化案例:

In [258]: a2=np.zeros((a.shape[0],a.shape[1]),dtype='i,i')
In [259]: a2['f0']=a
In [260]: a2['f1']=np.arange(1,4)

相同的構造,但具有如編輯中所述的排序值:

In [281]: idx=np.argsort(-a,axis=1)
In [282]: a1 = -np.sort(-a,1)
In [283]: a2=np.zeros((a.shape[0],a.shape[1]),dtype='i,i')
In [285]: a2['f0']=a1
In [286]: a2['f1']=idx
In [287]: a2
Out[287]: 
array([[(10, 2), ( 5, 0), ( 1, 1)],
       [( 4, 2), ( 3, 1), ( 2, 0)]], 
      dtype=[('f0', '<i4'), ('f1', '<i4')])

要獲得代表相應列索引降序排列的相應列索引的最終輸出,只需在每一行上使用np.argsort ,將axis參數列出為1-1 (以防萬一,您要處理多維數組),然后使用[:,::-1][...,::-1]翻轉多維數組的列。 argsort另一種替代方法是使用輸入數組的否定版本。 這樣,我們將不會處理形成索引及其得分的堆疊元組。

因此,使用np.argsort的兩個解決方案將是-

np.argsort(a,axis=1)[:,::-1]
np.argsort(-a,axis=1)

樣品運行-

In [51]: a
Out[51]: 
array([[ 5,  1, 10],
       [ 2,  3,  4]])

In [52]: np.argsort(a,axis=1)[:,::-1]
Out[52]: 
array([[2, 0, 1],
       [2, 1, 0]])

In [53]: np.argsort(-a,axis=1)
Out[53]: 
array([[2, 0, 1],
       [2, 1, 0]])

暫無
暫無

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

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