numpy Python像np.max(array,axis=1)一样并行执行np.logical_and

31moq8wy  于 2023-10-19  发布在  Python
关注(0)|答案(2)|浏览(117)

我有一个2D bool数组,形状为row*col,有没有什么有效的方法来水平地对数组执行AND操作?比如说,

k = np.array([[True, True, False],
              [True, False, False],
              [True, True, True]])

预计结果将是

np.array([False, False, True])

row和col都非常大,每500万次操作需要12秒以上的时间来执行for。每个任务有数千个500万个操作,这需要非常长的时间。

d4so4syb

d4so4syb1#

通过将np.logical_and应用于轴1(列)来减少k的维数:

np.logical_and.reduce(k, 1)
array([False, False,  True])
smdnsysy

smdnsysy2#

有一些关于np.logical_and.reduceall的讨论。从我的测试来看,np.logical_and.reduce通常比all快(但快不了多少),尽管它们在大型数组中几乎相同。

定时使用timeit

定义:

import numpy as np

rng = np.random.default_rng(42)

N = 10
M = 10_000
k = rng.random((N,M)) > 0.3
f1 = lambda: k.all(1)
f2 = lambda: np.logical_and.reduce(k, 1)

在创建定义后的交互式控制台中:

>>> %timeit f1()
10.2 µs ± 255 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

>>> %timeit f2()
8.98 µs ± 290 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

在脚本中:

import timeit

print(timeit.timeit(f1, number=100_000))  # 1.1502485000528395
print(timeit.timeit(f2, number=100_000))  # 1.0641808999935165

使用perfplot计时

在这里,我再次使用形状(N,M)进行测试。我有N=10和各种M

import numpy as np
import perfplot

N = 10
rng = np.random.default_rng(42)

perfplot.show(
    setup=lambda M: rng.random((N, M)) > 0.3,
    kernels=[
        lambda a: a.all(1),
        lambda a: np.logical_and.reduce(a, 1),
    ],
    labels=["all", "and & reduce"],
    n_range=[2**k for k in range(1, 23)],
    xlabel="M",
)

相关问题