【Python数据分析—NumPy】5.NumPy矩阵和通用函数

5.NumPy矩阵和通用函数



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中的矩阵和通用函数,包括如何创建矩阵以及通用函数的工作 方式。还简单介绍了算术运算函数、三角函数、位操作函数和比较函数等通用函数。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器视觉小学徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值