gpt4 book ai didi

python - numpy.logical_and 与乘法

转载 作者:太空宇宙 更新时间:2023-11-03 14:14:01 38 4
gpt4 key购买 nike

给定三个 numpy 数组 abc(编辑:具有相同的形状/大小), 似乎对于非复数

a * b * c != 0  # test element-wise whether all are non-zero

给出相同的结果:

np.logical_and(a, np.logical_and(b, c))

第一个版本是否有隐藏的陷阱?有没有更简单的方法来测试它?

最佳答案

一些观察:

import numpy as np
import timeit

a = np.random.randint(0, 5, 100000)
b = np.random.randint(0, 5, 100000)
c = np.random.randint(0, 5, 100000)

method_one = np.logical_and(np.logical_and(a, b), c)
%timeit np.logical_and(np.logical_and(a, b), c)

method_two = a*b*c != 0
%timeit a*b*c != 0

method_three = np.logical_and(np.logical_and(a.astype('bool'), b.astype('bool')), c.astype('bool'))
%timeit np.logical_and(np.logical_and(a.astype('bool'), b.astype('bool')), c.astype('bool'))

method_four = a.astype('bool') * b.astype('bool') * c.astype('bool') != 0
%timeit a.astype('bool') * b.astype('bool') * c.astype('bool') != 0


# verify all methods give equivalent results
all([
np.all(method_one == method_two),
np.all(method_one == method_three),
np.all(method_one == method_four)
]
)

1000 loops, best of 3: 713 µs per loop
1000 loops, best of 3: 341 µs per loop
1000 loops, best of 3: 252 µs per loop
1000 loops, best of 3: 388 µs per loop

True

一些解释:

  1. a*b*c != 0 方法的速度将取决于向量的 dtype,因为先进行乘法。因此,如果您有 float 或 bigints 或其他一些更大的数据类型,则此步骤将比相同长度的 boolean 或小整数向量花费更长的时间。强制转换为 bool dtype 可加快此方法的速度。如果向量有不同数据类型,事情会更慢。将整数数组乘以 float 组需要将整数转换为 float ,然后强制转换为 boolean 值。不是最优的。

  2. 由于我不明白的原因,Prune 的回答声明然而,逻辑测试更快似乎只有当输入向量已经是 boolean 值时才是正确的。也许在直接 logical_and() 方法中强制转换为 boolean 值的方式比使用 .asdtype('bool') 慢。

    <
  3. 最快的方法似乎是 (1) 提前将输入强制转换为 boolean 值,然后 (2) 使用 np.logical_and()

关于python - numpy.logical_and 与乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35004324/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com