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

时间:2017-03-02 09:25:29

标签: python arrays numpy boolean logical-operators

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

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()

5 个答案:

答案 0 :(得分:2)

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

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)]

答案 1 :(得分:1)

你可以使用numpy和array作为过滤器:

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)

答案 2 :(得分:1)

你的数组是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试图将你的数组转换为布尔值,但不知道你的意思 如果数组True的元素allTrue,或者any的{​​{1}}是True,那么该数组是print(all(y>0.0)) # False print(all(x-y > -Q1)) # True print(all(y>0.0) and all(x-y > -Q1)) # False 吗? 如果您的意思是“所有这些都必须为True&#39;”,您可以这样做:

and

在使用allany之前,您还可以在表格中按元素制作符合逻辑的print(all((y>0.0) & (x-y > -Q1))) # False 元素:

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.]

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

public void stateChanged(final ChangeEvent evt) {

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

直接将是(伪代码):

for element in array:
    if element > 0: