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

8iwquhpp  于 2023-08-05  发布在  其他
关注(0)|答案(7)|浏览(114)
x = np.arange(0,2,0.5)
valeur = 2*x

if valeur <= 0.6:
    print ("this works")
else:   
    print ("valeur is too high")

字符串
下面是我得到的错误:

if valeur <= 0.6:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()


我已经读了几篇关于a.any()或a.all()的文章,但仍然找不到一种真正清楚地解释如何解决问题的方法。我知道为什么Python不喜欢我写的东西,但我不知道如何修复它。

5f0d552i

5f0d552i1#

如果你看一下valeur <= 0.6的结果,你可以看到是什么导致了这种二义性:

>>> valeur <= 0.6
array([ True, False, False, False], dtype=bool)

字符串
所以结果是另一个数组,在本例中有4个布尔值。现在的结果应该是什么呢?当一个值为真时,条件是否应该为真?只有当所有值都为真时,条件才为真吗?
这正是numpy.anynumpy.all所做的。前者要求至少有一个true值,后者要求所有值都为true:

>>> np.any(valeur <= 0.6)
True
>>> np.all(valeur <= 0.6)
False

thtygnil

thtygnil2#

还有一个办法

import numpy as np

a = np.array([1,2,3,4])
b = np.array([5,6,7,8])
c = np.array([1,2,3,4])

print((a == b ).all())  #False
print((a == c ).all())   # True
print((a == b ).any())   #False
print((a == c ).any())   #True
print((a > 3 ).all())    #False

字符串

gfttwv5a

gfttwv5a3#

您评论:
valeur是等于[ 0]的向量。我对每一个单项都感兴趣。对于0.6以下的部分,则返回“this works”....
如果你对每一个术语都感兴趣,那么就编写代码,这样它就可以处理每一个术语。比如说。

for b in valeur<=0.6:
    if b:
        print ("this works")
    else:   
        print ("valeur is too high")

字符串
这将写两行。
当您尝试将numpy代码用于需要单个标量值的上下文时,该错误由numpy代码产生。if b:...只能做一件事。它本身不会遍历b的元素,对每个元素做不同的事情。
你也可以将迭代转换为列表解析,例如。

['yes' if b else 'no' for b in np.array([True, False, True])]

t40tm48m

t40tm48m4#

import numpy as np
x = np.arange(0,2,0.5)
valeur = 2*x
print(valeur <= 0.6)
'''# [ True False False False] due to this "if statement" cannot decide if the 
value is true or false
 #This is where you got ValueError of ambiguity
 #This error recomended you to use a.any() or a.all() built-in functions
 #a.any() :- any True is True i.e. ([ True False False False].any) will be 
True/1
 #a.all() :- all Ture is Ture i.e. ([ True False False False].all) will be 
False/0'''

if valeur.all() <= 0.6:
'''# Now in "if statement" valeur.all() is Flase/0
# so is 0 <= 0.6? 
# Ture right? '''
    print ("this works")
'''# This is the reason "this works"'''
else:   
    print ("valeur is too high")

字符串

jecbmhm3

jecbmhm35#

这也应该起作用,并且是对问题中所问问题的更接近的回答:

for i in range(len(x)):
    if valeur.item(i) <= 0.6:
        print ("this works")
    else:   
        print ("valeur is too high")

字符串

qaxu7uf2

qaxu7uf26#

如果您想对每个元素执行一些操作:
使用numpy的函数

import numpy as np
def temp(x):
    if x <= 0.6:
        print ("this works")
    else:   
        print ("valeur is too high")
arr = np.arange(0,1,0.1)
np.vectorize(temp)(arr)

字符串

n3ipq98p

n3ipq98p7#

对于这种特定的模式(如果元素满足特定条件,则将其Map到一个值,否则将其Map到另一个值),您可以使用np.where()

import numpy as np

x = np.arange(0,2,0.5)
valeur = 2*x

print(*np.where(2 * x <= 0.6, "this works", "valeur is too high"), sep='\n')

字符串
该输出:

this works
valeur is too high
valeur is too high
valeur is too high

相关问题