我从文件中读取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.]]
更长的示例输入(未解析)。
前两列应该是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.]]
我知道这个答案,它适用于单列排序。
我尝试按第二列排序,因为第一列已经排序了,但还不够。有时,第一列也会被重新排序,而且很糟糕。
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.]]
我还查看了这个问题。
回答中提到:
问题在于np.lexsort或np.sort无法处理dtype为object的数组。为了解决这个问题,您可以在创建order_list之前对rows_list进行排序:
import operator
rows_list.sort(key=operator.itemgetter(0,1,2))
但是,在类型为
ndarray
的sort
函数中没有key
参数。而在我的情况下,合并字段也不是一个选择。另外,我没有一个标题,所以如果我尝试使用
order
参数进行排序,就会出现错误。ValueError: Cannot specify order when the array has no fields.
我更倾向于原地排序,或者至少获得同类型的结果ndarray
。然后我希望将其保存到文件中。
我应该如何做到这一点,而不会破坏数据类型?
a[a[:,2].argsort()[::-1]]
而不是这样a[a[:,2].argsort()][::-1]
?这样做会更有效率吗? - Agostino