文章参考 https://zhuanlan.zhihu.com/p/32242331,例子都是一个一个敲得,python3 莫得问题嘞呀
一、window 安装
pip install numpy
切换清华下载源 ,scipy 以及matplotlib 可结合 numpy 实现更多计算以及绘图
pip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
测试安装
>>> from numpy import *
>>> eye(4)
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
二、创建NumPy Ndarray 对象
array() 函数创建 Ndarray 对象
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
参数说明:
名称 描述
- object 数组或嵌套的数列
- dtype 数组元素的数据类型,可选
- copy 对象是否需要复制,可选
- order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
- subok 默认返回一个与基类类型一致的数组
- ndmin 指定生成数组的最小维度
np.array([1, 2, 3, 4], ndmin=3) = [[[1 2 3 4]]]
三、矩阵合并
纵向合并 vstack
np.vstack((a,b)) 将 a, b 矩阵由原来两行两列,合并为四行两列
横向合并 hstack
np.hstack((a,b)) 将 a, b 矩阵由原来两行两列,合并为两行四列
concatenate 也可以矩阵合并
np.concatenate( (a1,a2), axis=0 ) 等价于 np.vstack( (a1,a2) )
np.concatenate( (a1,a2), axis=1 ) 等价于 np.hstack( (a1,a2) )
四、矩阵按条件截取
b = a[a>6] 返回结果为一维数组
a[a>6] = 0 将原矩阵中所有 大于6 的元素赋值为0
五、矩阵行列
a.shape 返回结果为含两个元素的元组 如:(2,5)及 2 行 5 列
六、函数生成矩阵
arange 和 range() 函数类似
a = np.arange(10) # 默认从0开始到10(不包括10),步长为1 返回 [0 1 2 3 4 5 6 7 8 9]
a2 = np.arange(5,20,2) # 从5开始到20(不包括20),步长为2,返回 [ 5 7 9 11 13 15 17 19]
linspace 等差数列
a = np.linspace(0,20,5) # 生成首位是0,末位是20,含5个数的等差数列 返回 [ 0. 5. 10. 15. 20.]
logspace 等比数列
logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0):
num为数列个数默认50,base 为指数底数 默认10 及为公比
返回结果为 [ 1. 2. 4. 8. 16. 32.] 从 1 开始,2^5 结束,以公比为 2 开始递增, 总共 6 个数=
a = np.logspace(start=0, stop=5, num=6, base=2)
a = np.logspace(start=0, stop=0, num=6, base=5) # 返回结果为 [1, 1, 1, 1, 1, 1]
ones、zeros、eye、empty
ones创建全1矩阵 ,zeros创建全0矩阵 ,eye创建单位矩阵 ,empty创建空矩阵(实际有值)
a_empty = np.empty((2, 2)) # 创建2*2的空矩阵 返回[[0.33930547, 0.75305503],[0.77334359, 0.12428655]]
fromstring 将字符串转换矩阵
np.fromstring(‘abcdefg’, dtype=np.int8) # 返回结果为 [ 97 98 99 100 101 102 103]
random 随机数生成数组
np.floor(10*np.random.random((2, 5))) # 返回结果为 [[3., 6., 6., 6., 3.], [1., 5., 3., 3., 9.]]
fromfunction 根据矩阵行号列号生成矩阵
fromfunction(func,(5,6)) 第一个参数为 生成矩阵方法,第二个参数为矩阵大小
def func(i,j):
return i+j
a = np.fromfunction(func,(5,6))
# 返回
[[ 0. 1. 2. 3. 4. 5.]
[ 1. 2. 3. 4. 5. 6.]
[ 2. 3. 4. 5. 6. 7.]
[ 3. 4. 5. 6. 7. 8.]
[ 4. 5. 6. 7. 8. 9.]]
七、矩阵的运算
矩阵常规运算
需满足第一个矩阵的 列数 等于第二个矩阵行数
a = np.array([[4, 5, 6], [1, 2, 3]])
b = np.array([[6, 5, 4], [3, 2, 1]])
print(a*b)
"""
[[24 25 24]
[ 3 4 3]]
"""
矩阵点乘
a1 = np.array([[1,2,3],[4,5,6]]) # a1为2*3矩阵
a2 = np.array([[1,2],[3,4],[5,6]]) # a2为3*2矩阵
print(a1.dot(a2))
"""
[[22 28]
[49 64]]
"""
如下所示
矩阵乘和点乘是不同的,矩阵相乘适用于 行列相同的矩阵,对应位置相乘,而矩阵点乘适用于第一个矩阵的列数等于第二个矩阵的行数
注意:
矩阵乘积
设A为 m * p 的矩阵,B为 p* n 的矩阵,那么称 A * B 的矩阵C为矩阵A与B的乘积
哈达马积(Hadamard product)
设矩阵 A 和矩阵 B 都是 m*n 的矩阵,及行列相同,则称 A * B 的矩阵 C 为哈达马积
克罗内克积(Kronecker Product)
克罗内克积是两个任意大小的矩阵间的运算,符号记作⊗。克罗内克积也被称为直积或张量积
矩阵的转置 a.T
a = np.array([[1,2,3],
[4,5,6]])
print(a.T) # print(a.transpose())也可以转置
"""
[[1, 4],
[2, 5],
[3, 6]]
"""
逆矩阵
设A是一个n阶矩阵,若存在另一个n阶矩阵B,使得: AB=BA=E ,则称方阵A可逆,并称方阵B是A的逆矩阵
需要先导入numpy.linalg,用linalg的inv函数来求逆
import numpy.linalg
a1 = np.array([[2, 4, 4], [4, 8, 6], [2, 8, 4]])
print(numpy.linalg .inv(a1))
"""
可能会报 numpy.linalg.LinAlgError: Singular matrix,奇异矩阵,代表当前矩阵无逆矩阵
[[ 0. 0.5 -0.5 ]
[-0.25 0. 0.25]
[ 0.5 -0.25 0. ]]
"""
矩阵信息获取
最值
a = np.array([[1,2,9],[4,5,0]])
print(a.max()) #获取整个矩阵的最大值 结果: 9
print(a.min()) #结果:0
print(a.max(axis=0)) # 获取每列最大值 [4,5,9]
print(a.max(axis=1)) # 获取每行最大值 [9,5]
# 要想获得最大最小值元素所在的位置,可以通过argmax函数来获得
print(a.argmax(axis=1))
# 结果为 [2 2]
平均值
mean() 函数,同样可以通过添加 axis 获取行列平均值
a.mean()、 a.mean(axis=0)、 a.mean(axis=1)
方差
var() 函数,同样可以添加 axis 获取行列方差
a.var()、 a.var(axis=0) 、 a.var(axis=1)
标准差
std()函数,同样可以添加 axis 获取行列标准差
a.std()、 a.std(axis=0)、 a.std(axis=1)
中值(中位数)
median(),同样可以添加 axis 获取行列中值
numpy.median(a)、 numpy.median(a, axis=1)、 numpy.median(a, axis=0):与其他写法不同
求和
sum()函数,同样可以添加 axis 获取行列和
a.sum()、 a.sum(axis=0)、 a.sum(axis=1)
累积和
cumsum()函数,同样可以添加 axis 获取行列累积和
a = np.array([[1,2,3],[4,5,6]])
print(a.cumsum()) # 对整个矩阵求累积和
# 结果 [ 1 3 6 10 15 21]
极差
ptp() 函数,同样可以添加 axis 获取行列极差
a.ptp()、 a.ptp(axis=0)、 a.ptp(axis=1)
八、NumPy IO
Numpy 可以读写磁盘上的文本数据或二进制数据。
NumPy 为 ndarray 对象引入了一个简单的文件格式:npy。
npy 文件用于存储重建 ndarray 所需的数据、图形、dtype 和其他信息。
常用的 IO 函数有:
load() 和 save()
load() 和 save() 函数是读写文件数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npy 的文件中。
np.save(file='outfile.npy', arr=[1, 2, 3, 4], allow_pickle=True, fix_imports=True)
print(np.load('outfile.npy'))
# 结果
"""
[1 2 3 4]
"""
savez()
savez() 函数用于将多个数组写入文件,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中。
np.savez(file='outfile.npz', arr_0=[1, 2, 3], arr_1=[4, 5, 6], allow_pickle=True, fix_imports=True)
print(np.load('outfile.npz')['arr_0'])
"""
[1 2 3]
"""
loadtxt() 和 savetxt()
loadtxt() 和 savetxt() 函数处理正常的文本文件(.txt 等)
np.savetxt('out.txt',[1,2,3,4,5])
print(np.loadtxt('out.txt'))
# 结果
"""
[1 2 3 4 5]
"""