【问题标题】:NumPy array permute columns 3D matrix with argsortNumPy 数组用 argsort 置换列 3D 矩阵
【发布时间】:2018-04-10 02:26:57
【问题描述】:

我需要将矩阵A3D 矩阵由axis 0)中的列元素置换为2D 置换矩阵piargsort 获得,其中包含所有列的新索引。

通过在矩阵A (A[pi]) 上应用置换矩阵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]]]

【问题讨论】:

  • 感谢威廉的帮助 :)。我是新来的。

标签: python numpy matrix


【解决方案1】:

也许是口味问题,但我发现以下内容更具可读性:

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]]])

【讨论】:

    猜你喜欢
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2019-02-11
    • 2021-09-14
    • 2015-04-30
    相关资源
    最近更新 更多