用Python优化数组之间的布尔比较

Nic*_*ick 3 python optimization boolean-logic numpy slice

我有一些Python代码,我正在尝试优化.它处理两个相同大小的2D阵列(它们的大小可以是任意的).第一个数组充满了任意布尔值,第二个数组充满了0到1之间的半随机数.

我要做的是根据修饰符数组中的值更改二进制值.这是一个工作正常的代码片段,并封装了我在两个for循环中尝试做的事情:

import numpy as np
xdim = 3
ydim = 4
binaries = np.greater(np.random.rand(xdim,ydim), 0.5)
modifier = np.random.rand(xdim,ydim)

for i in range(binaries.shape[0]):
    for j in range(binaries.shape[1]):
        if np.greater(modifier[i,j], 0.2):
            binaries[i,j] = False
Run Code Online (Sandbox Code Playgroud)

我的问题:有更好的(或更合适的)方法吗?我宁愿使用切片而不是嵌套for循环,但比较和布尔逻辑让我觉得这可能是最好的方法.

HYR*_*YRY 6

binaries &= ~(modifier > 0.2)
Run Code Online (Sandbox Code Playgroud)

modifiler > 0.2创建二进制数组,~运算符不做布尔值,并&=做布尔值and.

注意 ~ &=是按位运算符,但您可以将它们用作布尔运算符.

  • +1我认为将'False`分配给符合条件的项目会更快,即'binaries [modifier> 0.2] = False`,而不是`&`-ing两个数组,但你的答案快了大约10倍.如果你做`binaries&= modifier <= 0.2`,它当然会快一点. (3认同)