np.compress
内部的操作比布尔索引更快,原因是什么?
在这个例子中,compress
大约快20%,但是时间节省取决于数组a
和布尔数组b
中的True
值数量及其大小,但在我的机器上,compress
总是更快。
import numpy as np
a = np.random.rand(1000000,4)
b = (a[:,0]>0.5)
%timeit a[b]
#>>> 10 loops, best of 3: 24.7 ms per loop
%timeit a.compress(b, axis=0)
#>>> 10 loops, best of 3: 20 ms per loop
布尔索引的文档中提到:
返回的是数据的副本,而不像切片一样返回视图。
相比之下,压缩文档则表示:
沿给定轴返回数组的选定切片。
但是,使用此方法来确定两个数组是否共享相同的数据缓冲区,结果显示这两种方法都不与其父级a
共享数据,我认为也就意味着这两种方法都没有返回实际切片。
def get_data_base(arr):
base = arr
while isinstance(base.base, np.ndarray):
base = base.base
return base
def arrays_share_data(x, y):
return get_data_base(x) is get_data_base(y)
arrays_share_data(a, a.compress(b, axis=0))
#>>> False
arrays_share_data(a, a[b])
#>>> False
我很好奇,因为我在工作中经常执行这些操作。 我运行的是Python 3.5.2,Numpy版本为1.11.1,通过Anaconda安装。
np.where
将布尔值转换为索引数组,使用np.take
选择具有该数组的行。所有操作都会生成所选值的副本。时间可能更多地涉及调用开销和普遍性。 - hpaulj