Numpy简介:
NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算。Numpy底层使用C语言编写,数组中直接存储对象,而不是存储对象指针,所以其运算效率远高于纯Python代码。
今日学习:
1.numpy的基本操作
重点:
1.基本指令
numpy是python的一个库,使用之前先导入
import numpy as np#导入np包
a = np.array([[1, 2, 3], [4, 5, 6], [1, 2, 3]], dtype=np.int)#创建数组
print(a)
print("矩阵的维数:{}".format(a.ndim))
print("矩阵的行和列的个数分别为:{}".format(a.shape))
print("矩阵的元素数为:{}".format(a.size))
b = np.zeros((3, 3))#产生全零(3,3)数列
print(b)
c = np.empty((3, 3))#产生(3,3)空数列
print(c)
d = np.arange(1, 12, 2)#从1到12,步长为2,所有元素组成一个数列
print(d)
e = np.linspace(1, 10, 20)#产生一个线段,从1到10,一共20个元素
print(e)
结果如下
[[1 2 3]
[4 5 6]
[1 2 3]]
矩阵的维数:2
矩阵的行和列的个数分别为:(3, 3)
矩阵的元素数为:9
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
[ 1 3 5 7 9 11]
[ 1. 1.47368421 1.94736842 2.42105263 2.89473684 3.36842105
3.84210526 4.31578947 4.78947368 5.26315789 5.73684211 6.21052632
6.68421053 7.15789474 7.63157895 8.10526316 8.57894737 9.05263158
9.52631579 10. ]
对于arange和linspace功能可以使用reshape功能
d = np.arange(12).reshape((3,4))
print(d)
e = np.linspace(1, 10, 20).reshape((4,5))
print(e)
结果如下
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 1. 1.47368421 1.94736842 2.42105263 2.89473684]
[ 3.36842105 3.84210526 4.31578947 4.78947368 5.26315789]
[ 5.73684211 6.21052632 6.68421053 7.15789474 7.63157895]
[ 8.10526316 8.57894737 9.05263158 9.52631579 10. ]]
注意,这个过程中一定要做到行数乘以列数等于元素数,不然无法重新排列
2.基础运算
b = np.random.random((3, 3))#随机产生一个3*3的矩阵
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3]], dtype=np.int)
b = np.array([[1, 2, 4],
[3, 4, 6],
[5, 6, 9]])
print(a.dot(b))#print(np.dot(a,b))
print(a * b)
[[ 22 28 43]
[ 49 64 100]
[ 22 28 43]]#输出的是矩阵乘法
[ 1 4 12]
[12 20 36]
[ 5 12 27]]#输出算数乘法,返回对应位的乘法数值
注意区分不同乘法的应用
a = np.array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3]], dtype=np.int)
b = np.array([[1, 2, 4],
[3, 4, 6],
[5, 6, 9]])
print(a+b)
print(a-b)
print(np.dot(a,a))
print(a**2)
结果如下
[[ 2 4 7]
[ 7 9 12]
[ 6 8 12]]
[[ 0 0 -1]
[ 1 1 0]
[-4 -4 -6]]
[[12 18 24]
[30 45 60]
[12 18 24]]#注意区分平方和自身距真相乘的区别
[[ 1 4 9]
[16 25 36]
[ 1 4 9]]
3.求极限的操作
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3]], dtype=np.int)
b = np.array([[1, 2, 4],
[3, 4, 6],
[5, 6, 9]])
print(np.sum(a))
print(np.max(b))
print(np.sum(a,axis=1))#**axis=1代表在行进行操作,一共三行,返回三个值**
print(np.min(b,axis=0))#**axis=0代表在列进行操作,一共三列,返回三列每一列的最小值**
结果如下
27
9
[ 6 15 6]
[1 2 4]
4.其他操作
import numpy as np
a = np.array([[7, 7, 3],
[4, 9, 6],
[5, 2, 3]], dtype=np.int)
print(np.argmax(a))#最大值索引
print(np.argmin(a))#最小值索引
print(np.mean(a))#平均值
print(np.average(a))#平均值
print(np.median(a))#中间值
print(np.cumsum(a))#逐个相加
print(np.diff(a))#累差
print(np.sort(a))#逐行排序
print(np.transpose(a))#转置
print(a.T)#转置
print(np.clip(a,3,5))#所有小于3的数都变成3,所有大于5的数变成5,其他保留
5.循环操作
距真的每一行都可以看成一个列表,可以生成迭代器,并进行迭代循环
import numpy as np
a = np.array([[7, 7, 3],
[4, 9, 6],
[5, 2, 3]], dtype=np.int)
print(a[1, 1])#输出下标(1,1)的元素
print(a[1][1])#输出下标(1,1)的元素
print(a[:2][1:2])#可执行列表的操作
for row in a:
print(row)#循环输出行
for col in a.T:
print(col)#循环输出列
for item in a.flat:
print(item, end=" ")#循环输出所有元素,flat语句很重要
这里补充一个flatten语句
import numpy as np
a = np.array([[7, 7, 3],
[4, 9, 6],
[5, 2, 3]], dtype=np.int)
print(a.flatten())
结果如下
[7 7 3 4 9 6 5 2 3]
可以看出flatten输出所有元素,按行输出,返回一个列表
6.numpy array 合并
import numpy as np
a = np.array([7, 7, 3])[:,np.newaxis]#将行变成列
b = np.array([4, 9, 6])[:,np.newaxis]#将行变成列
print(a)
print(b)
结果如下
[[7]
[7]
[3]]
[[4]
[9]
[6]]
import numpy as np
a = np.array([7, 7, 3])
b = np.array([4, 9, 6])
print(np.vstack((a, b)))#上下合并
print(np.hstack((a, b)))#左右合并
print(np.concatenate((a, b, a), axis=0))#多个合并,axis=0代表在行操作
7.numpy array的分割
import numpy as np
a = np.arange(12).reshape((3,4))
print(a)
print(np.split(a,3,axis=0))#把a按行分成3行
print(np.split(a,4,axis=1))#把a按列分成4列,
print(np.array_split(a,3,axis=1))#把a按列分成三部分(不等分割)
结果如下
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0],
[4],
[8]]), array([[1],
[5],
[9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
对于vstack和hstack对于vsplite和hsplit
import numpy as np
a = np.arange(12).reshape((3, 4))
print(a)
print(np.hsplit(a, 4))
print(np.vsplit(a, 3))#必须分割成整数列或行
结果如下
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[array([[0],
[4],
[8]]), array([[1],
[5],
[9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
8.numpy copy和deep copy
在之前python的学习过程中,我们知道列表支持原位改变,如果a=[1,2,3]
b=a,我们改变啊a[0]=2,那么a=b=[2,2,3]
同理矩阵里面也是类似,这时候就需要我们使用copy功能,防止改变
import numpy as np
a = np.arange(12).reshape((3, 4))
b = a
a
Out[9]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
b
Out[10]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
a[0][0]=10
a
Out[12]:
array([[10, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
b
Out[13]:
array([[10, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
防止改变,我们使用copy功能
c=a.copy()
a[0][0]=5
a
Out[16]:
array([[ 5, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
c
Out[17]:
array([[10, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
d=a[:][:]
a[0][0]=3
a
Out[20]:
array([[ 3, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
d
Out[21]:
array([[ 3, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
a[0][0]=7
d
Out[23]:
array([[ 7, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
我们发现在列表中赋值的[:]功能在矩阵中赋值也会使对应值改变,所以在矩阵操作中只能使用copy