我有一个1d数组的u64整数。我需要分区的基础上给定的位到位。
在纯python中,两个指针问题很容易解决(类似于quicksort中的分区),但我想知道是否可以使用numpy有效地解决这个问题。
假设我有:
arr = np.arange(720, dtype=np.uint64) # a lot of 64bit unsigned ints
np.random.shuffle(arr) # in unknown order
left = arr[arr & 32 == 0] # all elements having 5th bit 0 in any order
right = arr[arr & 32 == 32] # all elements having 5th bit 1 in any order
arr[:] = np.concatenate([left, right])
我还需要知道分区的索引(也就是上面的len(left)
)。
4条答案
按热度按时间bvhaajcl1#
你可以使用argsort来为数组分配重新排序的索引(我使用最后一位而不是&32,以使结果更容易理解evens/odds):
如果不进行排序,您可以设置左右位置的掩码,通过计算掩码中的
True
值来测量左分区的大小,然后使用掩码和逆掩码部分分配下标。wtlkbnrh2#
一个可能的解决方案可以是
np.where()
,以获得满足条件的元素的索引。cidc1ykv3#
可以使用
np.argsort
:排序
arr & 32
是对两个值进行排序:0和32,这是您需要的分区。如果您需要分区索引,这将返回数组的最大值的第一个索引,即排序数据中的零的数量。
blpfk2vs4#
社区中有很多很酷的解决方案(谢谢大家!),但看起来使用纯numpy不可能保持O(1)空间。
我决定实现自己的分区例程并使用numba jit来接近numpy性能。