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