numpy 一个函数只需一个数字就可以工作,但不能用一个数组,我遗漏了什么?

wooyq4lh  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(104)

请原谅我的无知,但我对用python编写代码非常陌生。我有一个非常简单的函数;它只需要根据b相对于a和c的相对位置进行计算:

a = 6
b = 3
c = 2

def function(a, b, c):
    if ((a >= b) & (b >= c)):
        return b - c 
    elif ((a <= b) & (b >= c)):
        return a - c
    else:
        return 0 
t = function(a, b, c)
print(t)

当我像上面这样用简单的数字运行它时,无论我得到什么b,它都会给出正确的答案。(在本例中为1)
但是,当我使用a、b和c作为Numpy数组运行它时,它只返回整个“t”数组中的b-c。
它没有太大不同,但以下是我在数组版本中使用的内容:

def function(a, b, c):
    if ((a >= b) & (b >= c)).any():
        return b - c 
    elif ((a <= b) & (b >= c)).any():
        return a - c
    else:
        return 0 
t = function(a, b, c[i>1])
print(t)

(存在[i>1]是因为数组输入量是可变的,当[i=0]时会使用另一个函数)
我也尝试过这个:t=np.where(prev2>=head_elv)&(head_elv>=Bottom_ELV)).any,head_ELV-Bottom_ELV,0),但运行了相同的结果。
While循环会工作得更好吗?

yzuktlbb

yzuktlbb1#

我不认为在这里需要循环,因为这个问题可以使用数组操作来解决。假设数组的长度相同,您可以尝试下面的方法。


# import numpy to be able to work with arrays

import numpy as np

def function(a, b, c):
    # declare array t with only zeros
    t = np.zeros_like(a)

    # declare filters
    mask_1 = (a >= b) * (b >= c)
    mask_2 = (a <= b) * (b >= c)

    # modifying t based on the filters above
    t[mask_1] = (b - c)[mask_1]
    t[mask_2] = (a - c)[mask_2]
    return t

# example 2d arrays

a = np.array([[1800,5], [5,5]])
b = np.array([[3416,2], [3,4]])
c = np.array([[1714,2], [3,4]])

# run function

function(a, b, c)

相关问题