比较和布尔运算
使用“==”、“>”等比较运算符对两个数组进行比较,将返回一个布尔数组,它的每个元素值都是两个数组对应元素的比较结果。例如:
>>>np.array([1,2,3]) < np.array([3,2,1])
array([ True, False, False], dtype=bool)
每个比较运算符也与一个ufunc函数对应,下面是比较运算符和其ufunc函数的对照表:
y = x1 == x2
equal(x1, x2 [, y])
y = x1 != x2
not_equal(x1, x2 [, y])
y = x1 < x2
less(x1, x2, [, y])
y = x1 <= x2
less_equal(x1, x2, [, y])
y = x1 > x2
greater(x1, x2, [, y])
y = x1 >= x2
greater_equal(x1, x2, [, y])
由于Python中的布尔运算使用and、or和not等关键字,它们无法被重载,因此数组的布尔运算只能通过相应的ufunc函数进行。这些函数名都以“logical_”开头,在IPython中使用自动补全可以很容易地找到它们:
>>>np.logical # 按Tab进行自动补全
np.logical_and np.logical_not np.logical_or np.logical_xor
下面是一个使用logical_or()进行或运算的例子:
>>>a = np.arange(5)
>>>b = np.arange(4,-1,-1)
>>>a == b
array([False, False, True, False, False], dtype=bool)
>>>a > b
array([False, False, False, True, True], dtype=bool)
>>>np.logical_or(a==b, a>b) # 和 a>=b 相同
array([False, False, True, True, True], dtype=bool)
对两个布尔数组使用and、or和not等进行布尔运算,将抛出ValueError异常。因为布尔数组中有True也有False,NumPy无法确定用户的运算目的:
>>>a==b and a>b
ValueError: The truth value of an array with more than one
element is ambiguous. Use a.any() or a.all()
错误信息告诉我们可以使用数组的any()或all()方法[1]。只要数组中有一个值为True,则any()返回True;而只有数组的全部元素都为True,all()才返回True。
>>>np.any(a==b)
True
>>>np.any(a==b) and np.any(a>b)
True
以“bitwise_”开头的函数是比特运算函数,包括bitwise_and、bitwise_not、bitwise_or和bitwise_xor等。也可以使用”&”、”~”、”|”和”^”等操作符进行计算。
对于布尔数组来说,比特运算和布尔运算的结果相同。但在使用时要注意,比特运算符的优先级比比较运算符高,因此需要使用括号提高比较运算的运算优先级。例如:
>>>(a==b) | (a>b)
array([False, False, True, True, True], dtype=bool)
整数数组的比特运算和C语言的比特运算相同,在使用时要注意元素类型的符号,例如下面的arange()所创建的数组的元素类型为32位符号整数,因此对正数按位取反将得到负数。以整数0为例,按位取反的结果是0xFFFFFFFF,在32位符号整数中,这个值表示-1。
>>>~np.arange(5)
array([-1, -2, -3, -4, -5])
而如果对8位无符号整数数组进行比特取反运算:
>>>~np.arange(5, dtype=np.uint8)
array([255, 254, 253, 252, 251], dtype=uint8)
同样的整数0,按位取反的结果是0xFF,当它是8位无符号整数时,它的值是255。
Note:在NumPy中同时也定义了any()和all()函数。[numpy教程:逻辑函数Logic functions]
皮皮blog
numpy多维矩阵求和、平均值、中位数、方差
求和np.sum()
指定和的变量/精度类型
sum()默认使用和数组的元素类型相同的累加变量进行计算,如果元素类型为整数,就使 用系统的默认整数类型作为累加变量。在32位系统中,累加变量的类型为32 bit整型。因此对整数数组进行累加时可能会出现溢出问题;而对很大的单精度浮点数类型数组进行计算时,也可能出现精度不够的现象,这时可以通过dtype 参数指定累加变量的类型。
>>> b =np.ones(1000000, dtype=np.float32) * 1.1 # 创建一个很大的单精度浮点数数组
>>> b # 1.1无法使用浮点数精示,存在一些误差
array([ 1.10000002, 1.10000002,…,1.10000002], dtype=float32)
>>> np.sum(b) #使用单精度累加变量进行累加计算,误差将越来越大
1110920.5
>>>np.sum(b, dtype=np.double) #使用双精度浮点数则能够得到正确的值
1100000.0238418579
指定axis参数
求和运算将沿着指定的轴进行,可进行行和、列和运算。即,结果数组的形状是原始数组的形状除去其第axis个元素。也就是如果对0轴求和,0轴的维度就从n变成1了。
>>> np.sum(a,axis=1)
array([26, 19, 30, 22])
>>> np.sum(a, axis=0)
array([30, 15, 22, 25, 5])
data1 =random.randint(1, 10, (2, 3))
[[6 8 6]
[4 8 1]]s
=
sum(data1) #不同于numpy,python函数是直接对0轴计算列和;等价于
numpy.sum(data1,
axis
=
0) 留下行(axis = 0)
print(s)[10 16 7]
s
=numpy.sum(data1,
axis
=
1) #计算行和
print(s)[20 13]
s =numpy.sum(data1) #计算所有元素和
print(s)
47
求均值np.mean()
对于整数数组,它使用双精度浮点数进行计算,而对于其他类型的数组,则使用和数组元素类型相同的累加变量进行计算,如单精度浮点数使用单精度浮点数进行计算。
average()也可以对数组进行平均计算。它没有out和dtype参数,但有一个指定每个元素权值的weights参数。
用median()可以获得数组的中值。
求标准差和方差std()和var()分别计算数组的标准差和方差,有axis、out及dtype等参数。
[ numpy教程 - 统计函数]
皮皮blog
自定义ufunc函数