在NumPy中,基本算术运算符+、-和*隐式关联着通用函数add、subtract和multiply。
也就是说,当你对NumPy数组使用这些算术运算符时,对应的通用函数将自动被调用。除法包含的过程则较为复杂,在数组的除法运算中涉及三个通用函数divide、true_divide和floor_division,以及两个对应的运算符/和//。
a = np.array([2, 6, 5])
b = np.array([1, 2, 3])
print "Divide", np.divide(a, b), np.divide(b, a)
#output
Divide [2 3 1] [0 0 0]
print "True Divide", np.true_divide(a, b), np.true_divide(b, a)
#output
True Divide [2. 3. 1.66666667] [0.5 0.33333333 0.6 ]
print "Floor Divide", np.floor_divide(a, b), np.floor_divide(b, a) c = 3.14 * b #floor_divide函数总是返回整数结果,相当于先调用divide函数再调用floor函数。
print "Floor Divide 2", np.floor_divide(c, b), np.floor_divide(b, c) #floor函数将对浮点数进行向下取整并返回整数。
#output
Floor Divide [2 3 1] [0 0 0]
Floor Divide 2 [ 3. 3. 3.] [ 0. 0. 0.]
默认情况下,使用/运算符相当于调用divide函数
运算符//对应于floor_divide函数
print "// operator", a//b, b//a
remainder函数逐个返回两个数组中元素相除后的余数。如果第二个数字为0,则直接返回0。
a = np.arange(-4, 4)
print "Remainder", np.remainder(a, 2) #等同于a % 2
#output
Remainder [0 1 0 1 0 1 0 1]
mod函数与remainder函数的功能完全一致
fmod函数处理负数的方式与remainder、mod和%不同。所得余数的正负由被除数决定,与除数的正负无关。
print "Fmod", np.fmod(a, 2)
#output
Fmod [ 0 -1 0 -1 0 1 0 1]
rint函数对浮点数取整,但结果仍为浮点数类型
a = np.arange(1,3,0.5) #[1.,1.5,2.,2.5]
pr int np.rint(a) #[1.,2.,2.,2.]
三个运用位操作的小技巧——检查两个整数的符号是否一致,检查一个数是否为2的幂数,以及计算一个数被2的幂数整除后的余数。
XOR或者^操作符。XOR操作符又被称为不等运算符,因此当两个操作数的符号不一致时,XOR操作的结果为负数。
import numpy as np
x = np.arange(-9, 9)
y = -x
print "Sign different?", (x ^ y) < 0
print "Sign different?", np.less(np.bitwise_xor(x, y), 0) #^操作符对应于bitwise_xor函数,<操作符对应于less函数
在二进制数中,2的幂数表示为一个1后面跟一串0的形式,例如10、100、1000等。而比2的幂数小1的数表示为一串二进制的1,例如11、111、1111(即十进制里的3、7、15)等。如果我们在2的幂数以及比它小1的数之间执行位与操作AND,那么应该得到0。
print "Power of 2?\n", x, "\n", (x & (x - 1)) == 0
print "Power of 2?\n", x, "\n", np.equal(np.bitwise_and(x, (x - 1)), 0) #&操作符对应于bitwise_and函数,==操作符对应于equal函数。
计算余数的技巧实际上只在模为2的幂数(如4、8、16等)时有效。二进制的位左移一位,则数值翻倍。在前一个小技巧中我们看到,将2的幂数减去1可以得到一串1组成的二进制数,如11、111、1111等。这为我们提供了掩码(mask),与这样的掩码做位与操作AND即可得到以2的幂数作为模的余数。
print "Modulus 4\n", x, "\n", x & ((1 << 2) - 1)
print "Modulus 4\n", x, "\n", np.bitwise_and(x, np.left_shift(1, 2) - 1) #<<操作符对应于left_shift函数