【问题标题】:Numpy - Fastest way to create a integer index matrixNumpy - 创建整数索引矩阵的最快方法
【发布时间】:2021-12-11 10:14:41
【问题描述】:

问题:

我有一个代表产品的数组,比如说 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

【问题讨论】:

  • IIUC,但我不知道 mat 是什么:mat[new_order].T[new_order].T 重新排列列和行。
  • mat 被认为是一个通用矩阵,但它使文本混淆。你的解决方案已经成功了,谢谢!

标签: python arrays numpy matrix indexing


【解决方案1】:

只要为第二个轴提供正确的形状,您就可以直接将索引用作矩阵的下标:

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]])

【讨论】:

  • 谢谢,这可能更有用,因为我可以扩展到其他维度。
猜你喜欢
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
相关资源
最近更新 更多