假设我有一个方形索引矩阵,例如:
idxs = np.array([[1, 1],
[0, 1]])
以及一个方阵数组,大小与彼此相同(不一定与idxs
的大小相同):
mats = array([[[ 0. , 0. ],
[ 0. , 0.5]],
[[ 1. , 0.3],
[ 1. , 1. ]]])
我想用mats
中相应的矩阵替换idxs
中的每个索引,以获得:
array([[ 1. , 0.3, 1. , 0.3],
[ 1. , 1. , 1. , 1. ],
[ 0. , 0. , 1. , 0.3],
[ 0. , 0.5, 1. , 1. ]])
mats[idxs]
会给我一个嵌套版本的结果:
array([[[[ 1. , 0.3],
[ 1. , 1. ]],
[[ 1. , 0.3],
[ 1. , 1. ]]],
[[[ 0. , 0. ],
[ 0. , 0.5]],
[[ 1. , 0.3],
[ 1. , 1. ]]]])
于是我尝试使用reshape
,但是没有成功!mats[idxs].reshape(4,4)
返回:
array([[ 1. , 0.3, 1. , 1. ],
[ 1. , 0.3, 1. , 1. ],
[ 0. , 0. , 0. , 0.5],
[ 1. , 0.3, 1. , 1. ]])
如果有帮助的话,我发现
skimage.util.view_as_blocks
正好是我需要的相反操作(它可以将我的期望结果转换成嵌套的mats[idxs]
格式)。有没有(希望非常)快速的方法?对于应用程序,我的
mats
仍然只有几个小矩阵,但我的idxs
将是一个达到2^15阶的方阵,在这种情况下,我将替换超过一百万个索引来创建一个2^16阶的新矩阵。非常感谢您的帮助!