如何修复列表理解 'bitwise_and' 错误并优化 for 循环?

How to fix list comprehension 'bitwise_and' error and optimize for-loop?

我有下面的 for 循环,但我想把它变成一个计算效率更高的变体。我以为我可以通过列表理解来做到这一点,但这给了我以下错误:TypeError: ufunc 'bitwise_and' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

编辑 I:我正在尝试比较 input1 和 input2,如果 input1 大于 input2,则差值应由缩放器平方和缩放。否则,应将零值分配给输出。

我该如何解决这个问题,有没有其他方法可以进一步加快这个速度?

# Input variables
input1 = np.array([0.5, 1, 3, 7, 10])
input2 = np.array([0.5, 1.5, 2, 7, 8])
scaler = 3

# For loop
output = np.zeros(len(input1))
for i in range(len(input1)):
    if input1[i] > input2[i]:
        output[i] = scaler * (input1[i] - input2[i])**2  
    else: 
        output[i] = 0      

# List comprehension attempt, but gives error.
output = [scaler * (input1-input2)**2 for i in input1 & input2 if input1 > input2]  

你做的列表压缩是错误的。

如果你想

output = [scaler * (i1-i2)**2 if i1 > i2 else 0 for (i1, i2) in zip(input1, input2)]

print(output)

如果您尝试使用列表推导优化 for 循环,则以下等价:

# Input variables
input1 = np.array([0.5, 1, 3, 7, 10])
input2 = np.array([0.5, 1.5, 2, 7, 8])
scaler = 3

# List comprehension
output = [scaler * (x-y)**2 if x>y else 0 for (x,y) in zip(input1,input2)]

编辑:这可能更快,因为 numpy 可以向量化操作

# Numpy operations
arr = input1-input2
arr = arr.clip(min=0)
output = scaler * arr ** 2