使用 a.any() 或 a.all()

Using Use a.any() or a.all()

拆分数组的最佳方法是什么,以便我只能迭代负值、正值和零?例如:

x= [[-20., -15., -10.,  -5.,   0.,   5.,  10.,  15.,  20.]]
y= [[-20., -15., -10.,  -5.,   0.,   5.,  10.,  15.,  20.]]
Q1=8
Q2 =12

    if y>0.0 and x -y>=-Q1:
        return 'sum function'
    elif y<0.0 and x -y>=-Q2:
        return 'sum function'
    elif y==0.0 and x >=-Q1:
        return 'sum function'
    return 0.0 

我收到错误类型:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

您可以使用 numpy 和数组作为过滤器:

from numpy import array
x = array([-10, 5, -5, 10, 0, 0])
for u in x[x < 0]:
   print(u)
for u in x[x > 0]:
   print(u)
for u in x[x == 0]:
   print(0)

使用 numpy 的优势在于它将满足您所有的数字需求。

或者您可以使用生成器:

x = [-10, 5, -5, 10, 0, 0]
gen_x_pos = (u for u in x if u > 0)
for u in gen_x_pos:
    print(u)

您可以只使用逻辑索引将数组拆分为正数、负数和零:

import numpy

x = numpy.array([-20., -15., -10.,  -5.,   0.,   5.,  10.,  15.,  20.])
y = numpy.array([-20., -15., -10.,  -5.,   0.,   5.,  10.,  15.,  20.])
Q1 = 8
Q2 = 12

positives = x[x > 0]
negatives = x[x < 0]
zeroes = x[x == 0]

并且您可以使用 numpy.logical_and 同时对两个数组执行比较表达式,始终比较同一位置的两个值:

print y[numpy.logical_and(y > 0.0, x - y >= -Q1)]
print y[numpy.logical_and(y < 0.0, x - y >= -Q2)]
print y[numpy.logical_and(y == 0.0, x >= -Q1)]

你的数组是 numpy 数组。

y=np.array([[-20., -15., -10.,  -5.,   0.,   5.,  10.,  15.,  20.]])
x= np.array( [[-20., -15., -10.,  -5.,   0.,   5.,  10.,  15.,  20.]])
Q1=8
Q2 =12

print(y>0.0)
# [[False False False False False  True  True  True  True]]
print(x-y > -Q1)
#[[ True  True  True  True  True  True  True  True  True]]

y>0 and x-y >= -Q1 给出一个错误:您正在使用 Python 的 and - 它对两个布尔值进行操作 - 在两个数组之间。
所以 Python 试图将你的数组转换为布尔值,但不知道你的意思。
如果 all 个元素是 True,或者 any 个元素是 True,那么数组是 True 吗? 如果你的意思是 'all of them must be True',你可以这样做:

print(all(y>0.0))
# False
print(all(x-y > -Q1))
# True

print(all(y>0.0) and all(x-y > -Q1))
# False

在使用 allany 之前,您还可以在表格中逐个元素地创建逻辑 and

print(all((y>0.0) & (x-y > -Q1)))
# False

如果你想对满足两个条件的 (x,y) 对执行一个函数,你可以这样做:

condition = (y>0.0) & (x-y > -Q1)
valid_x = np.extract(condition, x)
valid_y = np.extract(condition, y)
print(valid_x, valid_y)
# [  5.  10.  15.  20.] [  5.  10.  15.  20.]

认为这是你想要的,但你没有指定你的输出。

def sum_function(x,y):
    return x[:, None] + y[None, :]   # or however you want to add them, broadcasted to 2D

def myFilter(x,y):
    x, y = x.squeeze(), y.squeeze()
    out=np.zeros((x.size,y.size))
    xyDiff = x[:, None] - y[None, :]
    out=np.where(np.bitwise_and(y[None, :] => 0.0, xyDiff >= -Q1), sum_function(x, y), out) # unless the sum functions are different
    out=np.where(np.bitwise_and(y[None, :] < 0.0, xyDiff >= -Q2), sum_function(x, y), out)
    return out

直截了当(伪代码):

for element in array:
    if element > 0: