我有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]])
我该如何解决?也就是说,得到一个排序数组?
答案 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
数据框,该数据框会自动创建从0
到n-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]])