5.NumPy矩阵和通用函数
文章目录
- 1、矩阵
- 2、通用函数(np.frompyfunc()、np.zeros_like()、.flat)
- 3、算术运算(np.add()、np.subtract()、np.multiply()、np.divide()、np.true_divide()、np.floor_division())
- 4、模运算(np.mod()、np.remainder()、np.fmod())
- 5、斐波那契数列(np.matrix()、np.ceil()、np.rint())
- 6、利萨如曲线(np.linspace()、np.pi、np.sin())
- 7、方波、锯齿波
- 8、位操作函数和比较函数(np.less()、np.bitwise_xor()、np.equal()、np.bitwise_and()、np.left_shift())
- 小结
1、矩阵
在NumPy中,矩阵是ndarray的子类,可以由专用的字符串格式来创建。与数学概念中的矩阵一样,NumPy中的矩阵也是二维的。矩阵的乘法运算和NumPy中的普通乘法运算不同,幂运算当然也不一样。
1.1、创建矩阵(np.mat()、.T、.I)
# 字符串调用np.mat()函数创建矩阵:矩阵的行与行之间用分号隔开,行内的元素之间用空格隔开
import numpy as np
A = np.mat("1 2 3;4 5 6;7 8 9")
print(A)
B = np.mat(np.arange(3, 12).reshape(3, 3)) # 使用NumPy数组进行创建
print(B)
# 用T属性获取转置矩阵
print(A.T)
# 用I属性获取逆矩阵
print(A.I)
1.2 从已有矩阵创建新矩阵(np,eye()、np.bmat())
# 创建单位矩阵
A = np.eye(3)
print(A)
B = A * 2
print(B)
# 使用字符串np.bmat()创建复合矩阵,可以用矩阵变量名代替数字
C = np.bmat("A B;B A")
print(C)
2、通用函数(np.frompyfunc()、np.zeros_like()、.flat)
通用函数的输入是一组标量,输出也是一组标量,它们通常可以对应于基本数学运算,如加、减、乘、除等。可以使用NumPy中的frompyfunc函数,通过一个Python函数来创建通用函数。
import numpy as np
def ultimate_answer(a):
result = np.zeros_like(a) # 使用zeros_like函数创建一个和a形状相同,并且元素全部为0的数组
result.flat = 33 # flat属性为提供了一个扁平迭代器,可以逐个设置数组元素的值
return result
ufunc = np.frompyfunc(ultimate_answer, 1, 1)
A = ufunc(np.arange(4))
B = ufunc(np.arange(6).reshape(2, 3))
print(A)
print(B)
3、算术运算(np.add()、np.subtract()、np.multiply()、np.divide()、np.true_divide()、np.floor_division())
在NumPy中,基本算术运算符+、-和*隐式关联着通用函数add、subtract和multiply。当对NumPy数组使用这些算术运算符时,对应的通用函数将自动被调用。除法包含的过程则较为复杂,在数组的除法运算中涉及三个通用函数divide、true_divide和floor_division,以及两个对应的运算符/和//。
a = np.array(([2, 6, 5], [5, 7, 9]))
b = np.array(([1, 2, 3], [4, 5, 6]))
print(a)
print(b)
# 加
add1 = a+b
add2 = np.add(a, b)
print(add1)
print(add2)
# 加
sub1 = a-b
sub2 = np.subtract(a, b)
print(sub1)
print(sub2)
# 乘
mul1 = a*b
mul2 = np.multiply(a, b)
print(mul1)
print(mul2)
# 数组的除法运算
a = np.array(([2, 6, 5], [5, 7, 9]))
b = np.array(([1, 2, 3], [4, 5, 6]))
print(a)
print(b)
div = np.divide(a, b)
print(div)
tdiv = np.true_divide(a, b)
print(tdiv)
fdiv = np.floor_divide(a, b)
print(fdiv)
c = a // b
print(c)
d = a / b
print(d)
4、模运算(np.mod()、np.remainder()、np.fmod())
模运算是指取模运算,即求m/n的余数,计算模数或者余数,可以使用NumPy中的mod、remainder和fmod函数和%运算符。这些函数的主要差异在于处理负数的方式,fmod函数在这方面异于其他函数。
import numpy as np
a = np.arange(-5,6)
print(a)
b = np.arange(1,12)
print(b)
c1 = np.mod(a,2)
print(c1)
c2 = np.mod(a,b)
print(c2)
d1 = np.remainder(a,2)
print(d1)
d2 = np.remainder(a,b)
print(d2)
e1 = a % 2
e2 = a % b
print(e1)
print(e2)
f1 = np.fmod(a,2)
print(f1)
f2 = np.fmod(a,b)
print(f2)
5、斐波那契数列(np.matrix()、np.ceil()、np.rint())
import numpy as np
F = np.matrix([[1, 1], [1, 0]], dtype="int64") # 斐波那契数列的递推关系可以用矩阵来表示
f = []
for i in range(10):
a = (F ** (i))[0, 0]
f.append(a)
print(f)
import numpy as np
n = np.array([-5.6, -4.2, -2.7, 2.7, 4.3, 5.5, 8.1])
print(np.ceil(n)) # 向上取整
print(np.rint(n)) # 四舍五入取整
6、利萨如曲线(np.linspace()、np.pi、np.sin())
在NumPy中,所有的标准三角函数如sin、cos、tan等均有对应的通用函数。利萨茹曲线(Lissajous curve)是一种很有趣的使用三角函数的方式。
x = A sin(at + n/2)
y = B sin(bt)
import numpy as np
from matplotlib.pyplot import plot
from matplotlib.pyplot import show
a = 9
b = 8
# 使用linspace函数初始化变量t,即从-pi到pi上均匀分布的201个点
t = np.linspace(-np.pi, np.pi, 201)
# 使用sin函数和NumPy常量pi计算变量x
x = np.sin(a*t + np.pi/2)
# 使用sin函数计算变量y
y = np.sin(b * t)
plot(x, y)
show()
7、方波、锯齿波
方波也是一种可以在示波器上显示的波形。方波可以近似表示为多个正弦波的叠加,任意一个方波信号都可以用无穷傅里叶级数来表示。
import numpy as np
from matplotlib.pyplot import plot
from matplotlib.pyplot import show
t = np.linspace(-np.pi, np.pi, 201)
k = np.arange(1, 9.)
k = 2 * k - 1
f = np.zeros_like(t)
for i in range(len(t)):
f[i] = np.sum(np.sin(k * t[i])/k)
f = (4 / np.pi) * f
plot(t, f)
show()
import numpy as np
from matplotlib.pyplot import plot
from matplotlib.pyplot import show
t = np.linspace(-np.pi, np.pi, 201)
k = np.arange(1, 9.)
f = np.zeros_like(t)
for i in range(len(t)):
f[i] = np.sum(np.sin(2 * np.pi * k * t[i])/k)
f = (-2 / np.pi) * f
plot(t, f, lw=1.0)
plot(t, np.abs(f), lw=2.0)
show()
8、位操作函数和比较函数(np.less()、np.bitwise_xor()、np.equal()、np.bitwise_and()、np.left_shift())
位操作函数可以在整数或整数数组的位上进行操作,它们都是通用函数。^、&、|、<<、>>等位操作符在NumPy中也有对应的部分,<、>、==等比较运算符也是如此。有了这些操作符,可以在代码中玩一些高级技巧以提升代码的性能。不过,它们会使代码变得难以理解,因此需谨慎使用。
import numpy as np
x = np.arange(-9, 9)
y = -x
print("X:",x)
print("Y:",y)
# XOR或者^操作符(不等运算符),当两个操作数的符号不一致时,XOR操作的结果为负数
print("Sign different?", (x ^ y) < 0)
# 在NumPy中,^操作符对应于bitwise_xor函数,<操作符对应于less函数
print("Sign different?", np.less(np.bitwise_xor(x, y), 0))
# 在NumPy中,&操作 符对应于bitwise_and函数,==操作符对应于equal函数
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))
# 在NumPy中,<<操作符对应于left_shift函数
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))
小结
介绍了NumPy中的矩阵和通用函数,包括如何创建矩阵以及通用函数的工作 方式。还简单介绍了算术运算函数、三角函数、位操作函数和比较函数等通用函数。