创建一个元素为从10到49的随机整数组成的5*5的ndarray对象a,将其中大于等于40的元素全部替换成100,[25,40)之间的元素全部替换成80,小于25的元素全部替换成60
import numpy as np
import random
n = np.array([[random.randint(10,49) for i in range(5)] for j in range(5)])
n[n>=40] = 100
n[25<=n and n<40] = 80
n[n<25] = 60
print(n)
报错ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
n[25<=n and n<40] = 80 有什么问题呢
import numpy as np
import random
n = np.array([[random.randint(10, 49) for i in range(5)] for j in range(5)])
print(n)
n[n >= 40] = 100
n[(25 <= n) & (n < 40)] = 80
n[n < 25] = 60
print(n)
第7行涉及到两个bool型元素的矩阵相加,不能用and,可以用numpy库中的一个函数
n[np.logical_and(n>=25, n<40)] = 80
容吾试言之
and:a and b,先对a进行布尔运算(调用a.bool()),若结果为假返回a,否则返回b
or:a or b,先对a进行布尔运算,若结果为真返回a,否则返回b
对np数组而言,直接对其进行布尔运算,其意义较为模糊(ambiguous),因为其中有多个元素,返回值难以说明,是所有元素都为True是返回True(all),还是存在元素为True时返回True(any),因此对np.array类型调用__bool__方法会抛出题中ValueError异常(应为np.array.__bool__的实现方式)
一个小实验
class Simple:
def __bool__(self):
raise Exception
s = Simple()
s and 1 # raise Exception
另一方面,np.array类型对应元素逐个and运算可用&运算符,等同于调用np.array.__and__方法,返回对应位置元素逐个and的结果