在Python中按单行/列排序3维数组-使用矢量化

问题描述 投票:0回答:1

我有一个3D多维arr =(x,y,z)形状的numpy数组。在此示例中,形状=(10000,99,2)。

即我们有10000个99 x 2二维数组的实例。

我想通过z索引中的值对整个数组进行排序,即根据每个列中每个实例的99个变量进行排名。

是否有使用矢量化方法的简便方法?我知道我可以循环进行10000次迭代,对2d数组进行如下排序并组合为3d输出。

np.unique(arr[:,0], return_inverse=True)
np.unique(arr[:,1], return_inverse=True)

鉴于我有10000个外部实例,但是我有兴趣避免循环并以更有效的方式对所有10000个值进行排序。

python arrays numpy sorting multidimensional-array
1个回答
1
投票

我不确定我是否完全理解z得分,但是您可以尝试:

np.sort(arr,axis=1)

示例3-d输入:

import numpy as np
rng_seed = 42  # control reproducibility
rng = np.random.RandomState(rng_seed)
arr=rng.randint(0,40,20).reshape(2,5,2)

输入看起来像:

[[[38 28]
  [14  7]
  [20 38]
  [18 22]
  [10 10]]

 [[23 35]
  [39 23]
  [ 2 21]
  [ 1 23]
  [29 37]]]

正在申请:

arr1=np.sort(arr,axis=1)
print (arr1)

为您提供每个实例中基于列的排序数组:

[[[10  7]
  [14 10]
  [18 22]
  [20 28]
  [38 38]]

 [[ 1 21]
  [ 2 23]
  [23 23]
  [29 35]
  [39 37]]]

如果想要每个值的等级,请尝试:

arr_rank = arr.argsort(axis=1)
print (arr_rank)

输出为:

[[[4 1]
  [1 4]
  [3 3]
  [2 0]
  [0 2]]

 [[3 2]
  [2 1]
  [0 3]
  [4 0]
  [1 4]]]
© www.soinside.com 2019 - 2024. All rights reserved.