【问题标题】:Python numpy sort array according to another array and broadcast over an axisPython numpy 根据另一个数组对数组进行排序并在轴上广播
【发布时间】:2022-01-23 00:12:15
【问题描述】:

我之前已经做过一百万次了——根据另一个数组对一个数组进行排序。但这一次它只是稍微复杂一点,我一直很难过如何去做。让我解释。我有两个数组,比如A:

[[1.59956565 1.16421459]
 [1.21548342 1.63884363]
 [0.73023302 0.54681896]
 [2.02628432 1.32127994]
 [0.2132793  0.26559821]
 [0.38242608 0.30073228]]

B:

[[[ 0.93634073  0.35109262]
  [-0.35109262  0.93634073]]

 [[-0.63561769  0.77200398]
  [ 0.77200398  0.63561769]]

 [[ 0.8331935   0.55298155]
  [-0.55298155  0.8331935 ]]

 [[ 0.96691332  0.25510513]
  [-0.25510513  0.96691332]]

 [[-0.41372983  0.91039971]
  [ 0.91039971  0.41372983]]

 [[ 0.84228545  0.53903174]
  [-0.53903174  0.84228545]]]

即,B 的维度比 A 的维度大 1。我想沿着最后一个轴拳疼A

[[1.16421459 1.59956565]
 [1.21548342 1.63884363]
 [0.54681896 0.73023302]
 [1.32127994 2.02628432]
 [0.2132793  0.26559821]
 [0.30073228 0.38242608]]

然后也按照这个排序对B的中轴进行排序,例如B 应该变成:

[[[-0.35109262  0.93634073]
  [ 0.93634073  0.35109262]]

 [[-0.63561769  0.77200398]
  [ 0.77200398  0.63561769]]

 [[-0.55298155  0.8331935 ]
  [ 0.8331935   0.55298155]]

 [[-0.25510513  0.96691332]
  [ 0.96691332  0.25510513]]

 [[-0.41372983  0.91039971]
  [ 0.91039971  0.41372983]]

 [[-0.53903174  0.84228545]
  [ 0.84228545  0.53903174]]]

如何使用argsortA 对视图或切片执行此操作?我试过了,但没有成功,因为B 中还有一个轴。

【问题讨论】:

  • 不清楚您对A 的排序应该如何影响B 的排序 - 看起来B 只是沿其轴之一排序?
  • 我已经编辑了这个问题,以便从数据中更加清楚。在B中,它的倒数第二个维度应该按照A的最后一个维度排序。
  • 很抱歉,但我仍然不清楚您对 A 的排序应该如何影响 B 的排序。您认为不是只提供数据,而是明确排序应该如何受影响,您能否准确指出 B 的所需排序在何处以及如何受到 A 的影响,以及如果您更改单个值会如何变化,例如? (目前看起来 B 是沿轴 1 排序的,但仅在第一个“列”中)
  • A 具有维度 (n, 2)。 B 具有尺寸 (n, 2, 2)。忘记B 的最后一个维度,它应该保持不变。在A 中的每个 2 大小数组中,如果第一个元素大于第二个元素,则在该索引处切换数组 B 的中间维度。这有意义吗?
  • 确实如此,然后看起来@fsl 的解决方案就是您所追求的?

标签: python numpy sorting


【解决方案1】:

这是使用take_along_axis的一种方法:

np.take_along_axis(B, A.argsort(1)[:, :, None], axis=1)

输出:

array([[[-0.35109262,  0.93634073],
        [ 0.93634073,  0.35109262]],

       [[-0.63561769,  0.77200398],
        [ 0.77200398,  0.63561769]],

       [[-0.55298155,  0.8331935 ],
        [ 0.8331935 ,  0.55298155]],

       [[-0.25510513,  0.96691332],
        [ 0.96691332,  0.25510513]],

       [[-0.41372983,  0.91039971],
        [ 0.91039971,  0.41372983]],

       [[-0.53903174,  0.84228545],
        [ 0.84228545,  0.53903174]]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多