我得到一个 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 对象的数组。要解决该问题,您可以在创建 order_list 之前对 rows_list 进行排序:
import operator
rows_list.sort(key=operator.itemgetter(0,1,2))
但是我在 sort
类型的函数中没有 key
参数 ndarray
。就我而言,合并字段不是替代方案。
此外,我没有标头,因此,如果我尝试使用 order
参数进行排序,则会出现错误。
ValueError: Cannot specify order when the array has no fields.
我宁愿就地排序或至少获得相同类型的结果 ndarray
。然后我想把它保存到一个文件中。
在不弄乱数据类型的情况下,我该怎么做?
原文由 Agostino 发布,翻译遵循 CC BY-SA 4.0 许可协议
Import 让 Numpy 猜测类型并就地排序:
或者,指定输入格式并排序到新数组:
输出: