簡體   English   中英

Numpy - 創建整數索引矩陣的最快方法

[英]Numpy - Fastest way to create a integer index matrix

問題:

我有一個代表產品的數組,例如讓我們說 3

prod = [1,2,3]

然后我有這些產品的相關矩陣(只是一個代表兩個產品之間的數字,為了簡單起見,我們稱之為 c_ij),在這種情況下是一個 3x3 矩陣

corr = [[c_11,c_12,c_13],
        [c_21,c_22,c_23],
        [c_31,c_32,c_33]]

問題是需要對 prod 數組進行混洗,然后我需要以 corr[i,j] 仍然表示 prod[i] 和 prod[j] 之間的相關性的方式對 corr 矩陣進行混洗

我的解決方案:

我知道我可以使用整數數組作為索引以相同的方式對多個數組進行混洗,如下所示:

order = [0,1,2]
new_order = np.random.permutation(order) # [2,0,1] for example
shuf_prod = prod[new_order]

在網上查看我發現要在矩陣中進行這項工作,我需要將順序數組轉換為矩陣,例如

new_order = [2,0,1]
new_index = [ [[2,2,2],[0,0,0],[1,1,1]],
              [[2,0,1],[2,0,1],[2,0,1]] ]

new_corr = corr[tuple(new_index)]
# this output what I want that is:
# [[c_33,c_31,c_32],
#  [c_13,c_11,c_12],
#  [c_23,c_21,c_22]]

題:

  1. 改組的整個解決方案看起來笨拙且效率低下,這是一個性能關鍵的應用程序,所以有更快的方法來做到這一點嗎? (我真的不關心代碼的簡單性,只關心性能)
  2. 如果這是這樣做的好方法,我如何從new_order數組創建new_index矩陣?

編輯: Michael Szczesny解決了這個問題

new_corr = corr[new_order].T[new_order].T

只要為第二個軸提供正確的形狀,您就可以直接使用索引作為矩陣的下標:

import numpy as np

mat = np.array([[3,4,5],
                [4,8,9],
                [5,9,7]])

order = np.array([2,0,1])

mat[order,order[:,None]]
array([[7, 5, 9],
       [5, 3, 4],
       [9, 4, 8]])

暫無
暫無

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

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