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 链接到任何列。换句话说,如果你在m 上调用np.sort(),如果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 数据框,该数据框会自动创建从0 到n-1 的列名。然后,您可以调用sort_values 方法并传入您想要的列索引,如果您希望它像numpy 中那样从上到下排序,则在其后跟上axis=0。
例子:
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