【问题标题】:Mix three vectors in a numpy array, then sort it在一个numpy数组中混合三个向量,然后对其进行排序
【发布时间】:2016-07-02 03:37:58
【问题描述】:

我有 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) out of bounds。

当我打印 m 时,我得到:

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

我该如何解决。也就是得到一个排序好的数组?

【问题讨论】:

  • 你有没有想过,axis=2 是什么? )0 = 行 1= 列(想想 'r'oman 'c'atholic -- 'R'ow 'C'olumn)

标签: python sorting numpy


【解决方案1】:

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 数据框,该数据框会自动创建从0n-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

【讨论】:

  • Yamspinner,tks。我认为您的提示中有一个错误:它不是:pd.DataFrame(m).sort_values(0,axis = 0),而是 pd.DataFrame(m).sort(0,axis = 0)
  • 没问题。 sort_values 实际上是 sort 的新版本,已被弃用。你可以在pandas.pydata.org/pandas-docs/stable/generated/…查看它
【解决方案2】:

您收到该错误是因为您没有索引为 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]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    相关资源
    最近更新 更多