我有一个二维数组A,以及另一个二维数组I,其中每一行对应于一组索引,我想用它们从A中提取对称的二维子array.我希望将所有这些子矩阵收集到一个三维数组中,而不是求助于for循环.

例如:

I = Array([[  0,   1,   0],
           [  0,   1,   1],
           [  0,   1,   2],
            ...,
           [  0,   1, 997],
           [  0,   1, 998],
           [  0,   1, 999]], dtype=int32)

因此,A的第一个子矩阵将是对称的3x3子数组A[[0, 1, 0], :][:, [0, 1, 0]].现在,我想定义一个三维数组B,其中有B[0, :, :] = A[I[0, :], :][:, I[0, :]]B[1, :, :] = A[I[1, :], :][:, I[1, :]]等.

我目前有以下代码

import numpy as np

A = A = np.random.rand(1000,1000)

current_idxs = np.arange(2)
possible_next_idxs = np.arange(1000)
I = np.hstack(( np.tile( current_idxs, (possible_next_idxs.shape[0], 1) ), possible_next_idxs ))

那么一个简单但缓慢的解决方案是

B = np.array([A[idx, :][:, idx] for idx in I ])

这给了我需要的结果,但速度非常慢,必须有一种方法来做我想要的矢量化的方式,但我不确定如何.似乎np.take_along_axis个可能是答案,但我try 过的都没有奏效.任何帮助都将不胜感激,因为构建这个子矩阵矩阵是我的代码中的一大瓶颈!

推荐答案

一些索引技巧!

B = A[ I[:, :, None], I[:, None, :] ]

验证:

>>> np.array_equal(
...     A[ I[:, :, None], I[:, None, :] ],
...     np.array([A[idx, :][:, idx] for idx in I ])
... )
True

Python相关问答推荐

将numpy数组存储在原始二进制文件中

Python在tuple上操作不会通过整个单词匹配

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

用NumPy优化a[i] = a[i-1]*b[i] + c[i]的迭代计算

如何设置视频语言时上传到YouTube与Python API客户端

ThreadPoolExecutor和单个线程的超时

如何指定列数据类型

从Windows Python脚本在WSL上运行Linux应用程序

如何使用两个关键函数来排序一个多索引框架?

关于两个表达式的区别

如何在Python请求中组合多个适配器?

如何使用正则表达式修改toml文件中指定字段中的参数值

为什么t sns.barplot图例不显示所有值?'

从嵌套极轴列的列表中删除元素

如何使用pytest在traceback中找到特定的异常

分解polars DataFrame列而不重复其他列值

如何将一个文件的多列导入到Python中的同一数组中?

Numpy`astype(Int)`给出`np.int64`而不是`int`-怎么办?

Pandas:使列中的列表大小与另一列中的列表大小相同

在使用ROLING()获得最大值时,是否可以排除每个窗口中的前n个值?