numpy 使用np.multiply(out=array[mask])不起作用

voase2hg  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(82)

我用numpy测试了就地操作的行为。我观察到以下情况:

test = np.arange(0, 10).reshape(2, 5)
mask = test > 5

这个管用

np.multiply(test, 3, out=test)

# Output: 
[[ 0  3  6  9 12]
 [15 18 21 24 27]]

但是这个

np.multiply(test[mask], 3, out=test[mask])

print(test)
# Output:
[[0 1 2 3 4]
 [5 6 7 8 9]]

没有为什么

gblwokeq

gblwokeq1#

以下是一些测试以供比较:
面具中的几个Truthy值:

import numpy as np

test = np.arange(100000)
mask = test < 100

%timeit np.multiply(test, 3, out=test, where=mask)
# 6.98 µs ± 90.2 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

%timeit test[mask] *= 3
# 21.3 µs ± 159 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

%timeit test[mask] = test[mask] * 3
# 21.9 µs ± 214 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

有很多真理的价值观:

test = np.arange(100000)
mask = test < 90000

%timeit np.multiply(test, 3, out=test, where=mask)
# 60.9 µs ± 554 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

%timeit test[mask] *= 3
# 100 µs ± 474 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

%timeit test[mask] = test[mask] * 3
# 120 µs ± 1.09 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

随机掩码:

test = np.arange(100000)
mask = np.random.choice([True, False], size=100000)

%timeit np.multiply(test, 3, out=test, where=mask)
# 411 µs ± 4.25 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

%timeit test[mask] *= 3
# 712 µs ± 7.93 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

%timeit test[mask] = test[mask] * 3
# 714 µs ± 5.72 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

为了完整性,不带掩码:

%timeit np.multiply(test, 3, out=test)
# 22.4 µs ± 126 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

所以我推荐使用np.multiplyout=arr以及where=mask

相关问题