在numpy数组中混合三个向量,然后对其进行排序

时间:2016-07-02 03:37:58

标签: python sorting numpy

我有3个numpy.ndarray矢量,X,Y和强度。我想将它混合在一个numpy数组中,然后按第三列(或第一列)排序。我尝试了以下代码:

m=np.column_stack((X,Y))
m=np.column_stack((m,intensity))
m=np.sort(m,axis=2)

然后我收到错误:ValueError:axis(= 2)超出范围。

当我打印m时,我得到:

array([[  109430,   285103,      121],
   [  134497,   284907,      134],
   [  160038,   285321,      132],
   ..., 
   [12374406,  2742429,      148],
   [12371858,  2741994,      148],
   [12372221,  2742017,      161]])

我该如何解决?也就是说,得到一个排序数组?

2 个答案:

答案 0 :(得分:0)

Axis=2不是指列索引,而是指数组的维度。这意味着numpy将尝试在数据中查找第三维,并在第三维中将其从最小到最大排序。在第一维(axis = 0)中从最小到最大排序将使所有行中的值从最小到最大。在第二维(axis = 1)中从最小到最大排序将使所有列中的值从最小到最大。例子如下。

此外,排序将根据基本数组的不同而有所不同。考虑两个阵列:非结构化和结构化。

<强>非结构化

X = np.nrandn(10)
X = np.nrandn(10)
intensity = np.nrandn(10)
m=np.column_stack((X,Y))
m=np.column_stack((m,intensity))

m被视为非结构化数组,因为没有fields链接到任何列。换句话说,如果您在np.sort()上致电m,则只会axis=0从上到下将它们从最小到最大排序,如果axis=1则从左到右排序。行未被保留。

Original

[[ 1.20122251  1.41451461 -1.66427245]
 [ 1.3657312  -0.2318793  -0.23870104]
 [-0.30280613  0.79123814 -1.64082042]]

Axis=1

[[-1.66427245  1.20122251  1.41451461]
 [-0.23870104 -0.2318793   1.3657312 ]
 [-1.64082042 -0.30280613  0.79123814]]

Axis = 0

[[-0.30280613 -0.2318793  -1.66427245]
 [ 1.20122251  0.79123814 -1.64082042]
 [ 1.3657312   1.41451461 -0.23870104]]

<强>结构化

如您所见,行中的数据结构未保留。如果您想保留行顺序,则需要将labels添加到datatypes并使用此方法创建一个数组。您可以使用order = label_name按其他列进行排序。

dtype = [("a",float),("b",float),("c",float)]
m = [tuple(x) for x in m]
labelled_arr = np.array(m,dtype)
print np.sort(labelled_arr,order="a")

这将得到:

[(-0.30280612629541204, 0.7912381363389004, -1.640820419927318)
 (1.2012225144719493, 1.4145146097431947, -1.6642724545574712)
 (1.3657312047892836, -0.23187929505306418, -0.2387010374198555)]

另一种更方便的方法是将数据传递到pandas数据框,该数据框会自动创建从0n-1的列名。然后,您可以调用sort_values方法并传入所需的列索引,并按axis=0跟随它,如果您希望它从上到下排序,就像在numpy中一样。

示例:

pd.DataFrame(m).sort_values(0,axis = 0)

输出:

          0         1         2
2 -0.302806  0.791238 -1.640820
0  1.201223  1.414515 -1.664272
1  1.365731 -0.231879 -0.238701

答案 1 :(得分:0)

您收到该错误是因为您的轴没有2索引。轴是零索引的。无论如何,np.sort将对每个列或每个行进行排序。从docs

开始考虑
  

order:str或str的列表,可选当a是带字段的数组时   定义,此参数指定首先比较哪些字段,   可以将单个字段指定为字符串,而不是全部   需要指定字段,但仍会使用未指定的字段,   按照他们在dtype中出现的顺序来打破关系。

例如:

In [28]: a
Out[28]: 
array([[0, 0, 1],
       [1, 2, 3],
       [3, 1, 8]])

In [29]: np.sort(a, axis = 0)
Out[29]: 
array([[0, 0, 1],
       [1, 1, 3],
       [3, 2, 8]])

In [30]: np.sort(a, axis = 1)
Out[30]: 
array([[0, 0, 1],
       [1, 2, 3],
       [1, 3, 8]])

所以,我认为你真正想要的是这个简洁的小成语:

In [32]: a[a[:,2].argsort()]
Out[32]: 
array([[0, 0, 1],
       [1, 2, 3],
       [3, 1, 8]])