【发布时间】:2018-01-16 10:34:04
【问题描述】:
我正在执行大量这样的计算:
A == A[np.newaxis].T
其中 A 是一个密集的 numpy 数组,它经常具有共同的值。
出于基准测试目的,我们可以使用:
n = 30000
A = np.random.randint(0, 1000, n)
A == A[np.newaxis].T
当我执行这个计算时,我遇到了内存问题。我相信这是因为输出不是更有效的 bitarray 或 np.packedbits 格式。第二个问题是我们执行的比较次数是必要的两倍,因为生成的布尔数组是对称的。
我的问题是:
- 是否可以在不牺牲速度的情况下以更节省内存的方式生成布尔 numpy 数组输出?我知道的选项是 bitarray 和 np.packedbits,但我只知道在创建大型布尔数组之后如何应用它们。
- 我们能否利用计算的对称性将处理的比较次数减半,同时又不牺牲速度?
我需要能够执行 & 和 |对布尔数组输出的操作。我尝试过 bitarray,这对于这些按位运算来说非常快。但是打包 np.ndarray -> bitarray 然后解包 bitarray -> np.ndarray 很慢。
[已编辑以提供说明。]
【问题讨论】:
-
x == x[:, None]似乎也能做你想做的事。 -
你的输出应该非常稀疏,所以我想说你想保存
True值的索引,而不是一些自制的packbits实现 -
您可以
argsort并比较连续的元素。即 O(n log n) 时间和 O(n) 空间。与直接方法的 O(n^2) 和 O(n^2) 相比。 -
@DanielF,对稀疏矩阵执行布尔运算是否可能/有效?我试过使用 & 和 |操作,但这些似乎没有实现。
-
您希望能够对两个 30k x 30k 布尔矩阵执行
and和or操作?或者你想以某种方式广播它们?