我需要通过从{A
获得的3D
排列矩阵axis
来排列矩阵2D
(pi
矩阵中的argsort
矩阵)列的元素1}},包含所有列的新索引。
通过矩阵pi
(A
)上的应用排列矩阵A[pi]
,我将获得具有新形状的4D
矩阵。例如,A
的形状为(2,3,4),A[pi]
的形状为(2,3,3,4)。
我可以使用以下命令从A[pi]
中提取所需的排序矩阵:
swapaxes (diagonal(A[pi], axis1=2, axis2=1),1,2)
但它似乎过于复杂和缓慢。
还有其他优雅的解决方案吗?
示例:
print(A)
[[[ 73 701 2411 2414]
[ 5515 8292 8414 16135]
[ 100 1241 2146 2931]]
[[ 1335 1747 3418 6312]
[ 3788 5449 5753 9738]
[ 565 3038 3800 5430]]]
pi=argsort(Norm_order(A),0)
print(pi)
[[1, 0, 1],
[0, 1, 0]]
print(swapaxes(diagonal(A[pi],axis1=2,axis2=1),1,2))
[[[ 1335 1747 3418 6312]
[ 5515 8292 8414 16135]
[ 565 3038 3800 5430]]
[[ 73 701 2411 2414]
[ 3788 5449 5753 9738]
[ 100 1241 2146 2931]]]
答案 0 :(得分:0)
也许是品味问题,但我发现以下内容更具可读性:
i, j = np.ogrid[:3, :4]
A[pi[..., None], i, j]
输出:
array([[[ 1335, 1747, 3418, 6312],
[ 5515, 8292, 8414, 16135],
[ 565, 3038, 3800, 5430]],
[[ 73, 701, 2411, 2414],
[ 3788, 5449, 5753, 9738],
[ 100, 1241, 2146, 2931]]])