[英]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]]
題:
編輯: 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.