gpt4 book ai didi

python - Numpy 在多列上排序 ndarray

转载 作者:太空狗 更新时间:2023-10-29 21:26:24 28 4
gpt4 key购买 nike

我得到一个 ndarray 从文件中读取它,就像这样

my_data = np.genfromtxt(input_file, delimiter='\t', skip_header=0)

示例输入(已解析)

[[   2.    1.    2.    0.]
[ 2. 2. 100. 0.]
[ 2. 3. 100. 0.]
[ 3. 1. 2. 0.]
[ 3. 2. 4. 0.]
[ 3. 3. 6. 0.]
[ 4. 1. 2. 0.]
[ 4. 2. 4. 0.]
[ 4. 3. 6. 0.]]

更长example input (未解析)。

前两列应该是int,而最后两列应该是float,但这就是我得到的。欢迎提出建议。

主要问题是,我正在尝试使用 Numpy 对其进行排序,以便对行进行排序,优先考虑第二列中的数字,然后是第一列中的数字。

所需输出示例

[[   2.    1.    2.    0.]
[ 3. 1. 2. 0.]
[ 4. 1. 2. 0.]
[ 2. 2. 100. 0.]
[ 3. 2. 4. 0.]
[ 4. 2. 4. 0.]
[ 2. 3. 100. 0.]
[ 3. 3. 6. 0.]
[ 4. 3. 6. 0.]]

我知道 this answer ,它适用于对单个列上的行进行排序。

我尝试对第二列进行排序,因为第一列已经排序,但这还不够。有时,第一列也会被重新排序,这很糟糕。

new_data = my_data[my_data[:, 1].argsort()]
print(new_data)

#output
[[ 2. 1. 2. 0.]
[ 4. 1. 2. 0.] #ouch
[ 3. 1. 2. 0.] #ouch
[ 2. 2. 100. 0.]
[ 3. 2. 4. 0.]
[ 4. 2. 4. 0.]
[ 2. 3. 100. 0.]
[ 3. 3. 6. 0.]
[ 4. 3. 6. 0.]]

我还检查了 this question

答案提到

The problem here is that np.lexsort or np.sort do not work on arrays of dtype object. To get around that problem, you could sort the rows_list before creating order_list:

import operator
rows_list.sort(key=operator.itemgetter(0,1,2))

但是我在 ndarray 类型的 sort 函数中没有 key 参数。就我而言,合并字段不是替代方案。

此外,我没有 header ,因此,如果我尝试使用 order 参数进行排序,则会出现错误。

ValueError: Cannot specify order when the array has no fields.

我宁愿就地排序或至少获得相同类型的结果ndarray。然后我想把它保存到一个文件中。

我该怎么做才能不弄乱数据类型?

最佳答案

numpy ndarray 按第一、第二或第三列排序:

>>> a = np.array([[1,30,200], [2,20,300], [3,10,100]])

>>> a
array([[ 1, 30, 200],
[ 2, 20, 300],
[ 3, 10, 100]])

>>> a[a[:,2].argsort()] #sort by the 3rd column ascending
array([[ 3, 10, 100],
[ 1, 30, 200],
[ 2, 20, 300]])

>>> a[a[:,2].argsort()][::-1] #sort by the 3rd column descending
array([[ 2, 20, 300],
[ 1, 30, 200],
[ 3, 10, 100]])

>>> a[a[:,1].argsort()] #sort by the 2nd column ascending
array([[ 3, 10, 100],
[ 2, 20, 300],
[ 1, 30, 200]])

解释一下这里发生了什么:argsort() 正在传回一个包含其父级整数序列的数组: https://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html

>>> x = np.array([15, 30, 4, 80, 6])
>>> np.argsort(x)
array([2, 4, 0, 1, 3])

先按第 3 列排序,然后按第 2 列排序,然后按第 1 列排序:

>>> a = np.array([[2,30,200], [1,30,200], [1,10,200]])

>>> a
array([[ 2, 30, 200],
[ 1, 30, 200],
[ 1, 10, 200]])

>>> a[np.lexsort((a[:,2], a[:,1],a[:,0]))]
array([[ 1, 10, 200],
[ 1, 30, 200],
[ 2, 30, 200]])

同上但相反:

>>> a[np.lexsort((a[:,2], a[:,1],a[:,0]))][::-1]
array([[ 2 30 200]
[ 1 30 200]
[ 1 10 200]])

关于python - Numpy 在多列上排序 ndarray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29352511/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com