python - 如何对二进制值数组的行进行排序,就好像它们是长二进制数一样?

标签 python arrays sorting numpy

有一个大约 500000 行的 2D numpy 数组,每行 512 个值:

[
  [1,0,1,...,0,0,1], # 512 1's or 0's
  [0,1,0,...,0,1,1],
  ...
  [0,0,1,...,1,0,1], # row number 500000
]

如何将行升序排序,就好像每一行都是一个 512 位长整数?

[
  [0,0,1,...,1,0,1],
  [0,1,0,...,0,1,1],
  [1,0,1,...,0,0,1],
  ...
]

最佳答案

除了转换为字符串之外,您还可以使用数据的 void View (来自@Jaime here )并据此使用 argsort

def sort_bin(b):
    b_view = np.ascontiguousarray(b).view(np.dtype((np.void, b.dtype.itemsize * b.shape[1])))
    return b[np.argsort(b_view.ravel())] #as per Divakar's suggestion

测试

np.random.seed(0)

b = np.random.randint(0, 2, (10,5))
print(b)
print(sort_bin(b))

[[0 1 1 0 1]
 [1 1 1 1 1]
 [1 0 0 1 0]
 ..., 
 [1 0 1 1 0]
 [0 1 0 1 1]
 [1 1 1 0 1]]
[[0 0 0 0 1]
 [0 1 0 1 1]
 [0 1 1 0 0]
 ..., 
 [1 1 1 0 1]
 [1 1 1 1 0]
 [1 1 1 1 1]]

应该更快,占用内存更少,因为 b_view 只是 b

的一个 View
t = np.random.randint(0,2,(2000,512))

%timeit sort_bin(t)
100 loops, best of 3: 3.09 ms per loop

%timeit np.array([[int(i) for i in r] for r in np.sort(np.apply_along_axis(lambda r: ''.join([str(c) for c in r]), 0, t))])
1 loop, best of 3: 3.29 s per loop

实际上快了大约 1000 倍

关于python - 如何对二进制值数组的行进行排序,就好像它们是长二进制数一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46952690/

相关文章:

c# - 检查 C# BitArray 非零值的最快方法

java arraylist排序和优化

javascript - 如何按照预定的层次结构对 JavaScript 数组进行排序

python - 重复 pandas 数据帧的特定行

python - Django反向查询

javascript - 返回函数的值而不是 Array.forEach 中的内部函数

php - 在 codeigniter 中获取列值数组

PHP:首先对文件夹进行排序,然后对文件进行排序

在循环中更新多个类变量的 Pythonic 方法?

python: 如何使用 TO、CC 和 BCC 发送邮件?