【发布时间】:2017-05-09 09:19:20
【问题描述】:
鉴于我有一个索引方阵,例如:
idxs = np.array([[1, 1],
[0, 1]])
和一个彼此大小相同的方阵数组(不一定与idxs大小相同):
mats = array([[[ 0. , 0. ],
[ 0. , 0.5]],
[[ 1. , 0.3],
[ 1. , 1. ]]])
我想将idxs中的每个索引替换为mats中对应的矩阵,得到:
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 阶矩阵。
非常感谢您的帮助!
【问题讨论】:
-
糟糕!是的,应该 - 谢谢!
标签: python performance numpy indexing vectorization