切片或掩盖?

时间:2016-08-09 05:48:47

标签: python arrays numpy

我不确定我的问题是否有一般答案,但我想知道阵列屏蔽或切片是否更好"仅操纵数组的一部分。随着"更好"我的意思是关于性能(执行操作的速度,内存开销,即中间数组等)。关于使用哪一个,是否有任何经验法则?

2 个答案:

答案 0 :(得分:0)

这些是使用timeit

的一些结果
import numpy as np

x= np.arange(10000)

% timeit x[[np.arange(0,10000,2)]]
#output: 10000 loops, best of 3: 41.4 µs per loop

将索引值分配给另一个数组

% timeit z = x[[np.arange(0,10000,2)]]
#output: 10000 loops, best of 3: 41.9 µs per loop

或者,为索引数组赋值

% timeit x[[np.arange(0,10000,2)]] = 1
#output: 1000 loops, best of 3: 151 µs per loop

现在让我们尝试使用屏蔽:

x = np.ma.array(np.arange(10000))

% timeit x.mask = [1 if i%2==0 else 0 for i in np.arange(10000)]
#output: 100 loops, best of 3: 11.6 ms per loop

如果您已有掩盖存储的值

maskValues = [1 if i%2==0 else 0 for i in np.arange(10000)]

% timeit x.mask = maskValues
# output: 1000 loops, best of 3: 712 µs per loop

因此,对于这个例子,numpy中的索引变得更简单,更快

答案 1 :(得分:0)

还应该注意,您可以创建一个可重复使用的slice对象,而不是创建一个很小且非常快的索引掩码或索引数组(假设是连续或规则间隔的切片)。

n = 10000
test_array = np.arange(n)

# Mask
mask = np.ones(n, dtype=bool)
mask &= test_array >= 50
mask &= test_array < 9500

# Slice object
slc = slice(50, 9500)

为面具计时:

%timeit test_array[mask]
#output: 10.8 µs ± 101 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

对切片对象进行计时:

%timeit test_array[slc]
#output: 200 ns ± 1.88 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

当然,这最适合一维使用。