【问题标题】:Using Use a.any() or a.all()使用 使用 a.any() 或 a.all()
【发布时间】:2017-07-21 22:35:07
【问题描述】:

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

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

【问题讨论】:

  • 您有嵌套列表。有必要吗?
  • 是的@Dmitry,因为这是我在主代码中打印 y 和 x 时得到的形式。我只是想保持它在我的主代码中生成的形式
  • @Dmitry,在我的主代码中,当打印 y 时,我得到类似 y= [[-200. -197.98994975 -195.9798995 ..., 195.9798995 197.98994975 200. ]] 的内容。这就是为什么我的问题保持不变。
  • 我建议使用filter
  • 预期输出是什么?数组还是值?

标签: python arrays numpy boolean logical-operators


【解决方案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

【讨论】:

  • 你好@daniel Forsman。谢谢。在过去的一天里,我一直在为此苦苦挣扎。我对python比较陌生。您能否从上一个问题的链接中查看我的功能是如何构造的? stackoverflow.com/questions/42545861/…
  • 这仍然没有告诉我你想要什么。您甚至没有在代码中调用该函数。尝试一次运行几行代码并了解您正在创建的内容,因为看起来您确实编写了一堆代码而没有在任何步骤进行测试,并且只是在尝试修复显式错误。这几乎不会给你想要的输出。
  • 谢谢@Daniel,我会的。
  • 你好丹尼尔@Daniel Forsman。我已按照您的建议修改了代码,但在 myFilter out=np.zeros((x.size,y.size)) AttributeError: 'builtin_function_or_method' object has no attribute 'size' 中仍然出现错误第 57 行。你知道为什么吗?这是链接stackoverflow.com/questions/42554270/…
  • 是 x 和 y 嵌套列表而不是 numpy 数组吗?
【解决方案2】:

您的数组是 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&gt;0 and x-y &gt;= -Q1 给出错误:您正在使用 Python 的 and - 对两个布尔值进行操作 - 在两个数组之间。
因此 Python 尝试将您的数组转换为布尔值,但不知道您的意思。
如果其元素的allTrue,或者如果其中的anyTrue,则数组是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.]

【讨论】:

    【解决方案3】:

    直截了当就像(伪代码):

    for element in array:
        if element > 0:
    

    【讨论】:

      【解决方案4】:

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

      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.logical_and(y &gt; 0.0, x - y &gt;= -Q1) 返回一个数组,在不使用allany 的情况下仍然无法转换为布尔值
      • 是的,它为条件为真的所有元素返回一个布尔数组。也许我误解了 OP 希望它返回什么......
      • 据我了解,他想在它的条件下使用它:if (......)。他得到一个错误,因为and 不能对数组做任何事情,因为它们不能被转换为布尔值......至少对于 Python3。在 Python 2 中,对于任何列表,y>0.0 的计算结果为 True。 Python 3 拒绝比较列表和浮点数。
      • 嗯,再看一遍问题,误解了他的意思……
      • @ThierryLathuille,仍在努力让它工作。您能否在之前的帖子中看到我的部分代码,以便您明白我的意思? stackoverflow.com/questions/42545861/…
      【解决方案5】:

      您可以使用 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)
      

      【讨论】:

        猜你喜欢
        • 2016-04-01
        • 2016-12-14
        • 1970-01-01
        • 2018-07-28
        • 2021-08-31
        • 2016-12-01
        • 1970-01-01
        • 2019-01-24
        • 2021-08-06
        相关资源
        最近更新 更多