繁体   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