4

我遇到了这个 python 代码(它有效),对我来说这似乎很神奇。但是,我无法弄清楚这段代码在做什么。为了复制它,我写了一个测试代码:

import numpy as np

# Create a random array which represent the 6 unique coeff. 
# of a symmetric 3x3 matrix
x = np.random.rand(10, 10, 6)

所以,我有 100 个对称的 3x3 矩阵,我只存储唯一的组件。现在,我想生成完整的 3x3 矩阵,这就是魔法发生的地方。

indices = np.array([[0, 1, 3],
                    [1, 2, 4],
                    [3, 4, 5]])

我明白这是在做什么。这就是 0-5 索引分量应如何排列在 3x3 矩阵中以具有对称矩阵。

mat = x[..., indices]

这条线让我迷路了。因此,它正在处理 x 数组的最后一个维度,但我完全不清楚重新排列和整形是如何完成的,但这确实返回了一个形状为 (10、10、3、3) 的数组。我很惊讶也很困惑!

4

1 回答 1

1

来自高级索引文档 - bi rico 的链接。

例子

假设 x.shape 是 (10,20,30) 并且 ind 是一个 (2,3,4) 形的索引 intp 数组,那么result = x[...,ind,:] 的形状是 (10,2,3, 4,30),因为 (20,) 形子空间已被 (2,3,4) 形广播索引子空间替换。如果我们让 i, j, kloop 在 (2,3,4) 形子空间上循环,则 result[...,i,j,k,:] =x[...,ind[i,j,k] ,:]。此示例产生与 x.take(ind, axis=-2) 相同的结果。

于 2015-01-09T08:49:32.020 回答