# numpy
- N维数组(矩阵),快速高效,矢量数学运算
- 高效的Index,不需要循环
- 开源免费跨平台,运行效率足以和C/Matlab媲美
*官网 https://numpy.org/doc/stable/user/index.html
# 数组的创建和访问
# create Array from Python list
import numpy as np
list_1 = [1, 2, 3, 4]
array_1 = np.array(list_1) # 一维数组
list_2 = [5, 6, 7, 8]
array_2 = np.array([list_1, list_2]) # 二维数组
array_3=np.arange(1,10) #创建1到10的数组
array_4=np.arange(1,10,2) #创建1到10的数组,间隔2
array_5=np.zeros(5) #创建5个为0的数组
array_6=np.zeros([2,3]) #创建2*3个为0的数组
array_7=np.eye(5) #创建5*5的单位矩阵
array_2.shape # 数组的维度
array_2.size # 数组元素的个数
array_2.dtype #数组元素的数据类型
array_3[1] #访问第1个元素
array_3[2:4] #访问第2到3个元素
array_2[1,2] #访问第1行,第2个元素
array_2[1][2] #访问第1行,第2个元素
array_7=np.array([[1,2,3],[4,5,6],[7,8,9]])
#切片
array_8[:2,1:] #从第0行到第2行,从第1列到最后一列
# Array与Matrix
import numpy as np
np.random.randn(10) #创建一个10个元素的1维数组
np.random.randint(10) # 创建一个10以内的数据整数
np.random.randint(10,size=10) # 创建一个10以内的10个元素的一维的整数数组
np.random.randint(10,size=(2,3)) # 创建一个10以内的2*3的二维的整数数组
np.random.randint(10,size=20).reshape(4,5) # 创建一个10以内的20个元素的一维的整数数组,转化为4*5的二维数组
# 数组的运算
a=np.random.randint(10,size=20).reshape(4,5)
b=np.random.randint(10,size=20).reshape(4,5)
a+b
a-b
a*b
a/b
# matrix
np.mat([[1,2,3],[4,5,6]])
np.mat(a) #通过二维数组创建
# 矩阵的运算
A = np.mat(a)
B = np.mat(b)
A+B
A-B
A1=np.mat(np.random.randint(10,size=20).reshape(5,4))
B1=np.mat(np.random.randint(10,size=20).reshape(4,5))
A1*B1
# Array 的 function
a=np.random.randint(10,size=20).reshape(4,5)
a
np.unique(a) #计算a中唯一的元素
sum(a) #计算每一列的元素和
sum(a[0]) #计算第一行的元素和
sum(a[:,0]) #从上到下计算第一列的元素和
a.max() #计算a中的最大值
max(a[0]) #计算a中第一行的最大值
max(a[:,0]) #从上到下计算第一列的元素最大值
# Array 的input和output操作
# 使用pickle序列化numpy array
import pickle
import numpy as np
x = np.arange(10)
f = open('x.pkl','wb')
pickle.dump(x,f)
!ls
f=open('x.pkl','rb')
b=pickle.load(f)
np.save('one_array',x)
!ls
t=np.load('one_array.npy')
y=np.arange(20)
np.savez('two_array.npz',a=x,b=y)
!ls
c=np.load('two_array.npz')
c['a']
c['b']
# 附录
# 数组的创建和访问(附录)
import numpy as np
list_1 = [1, 2, 3, 4]
array_1 = np.array(list_1) # 一维数组
list_1
[1, 2, 3, 4]
array_1
array([1, 2, 3, 4])
list_2 = [5, 6, 7, 8]
array_2 = np.array([list_1, list_2]) # 二维数组
list_2
[5, 6, 7, 8]
array_2
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
array_3=np.arange(1,10) #创建1到10的数组
array_4=np.arange(1,10,2) #创建1到10的数组,间隔2
array_5=np.zeros(5) #创建5个为0的数组
array_6=np.zeros([2,3]) #创建2*3个为0的数组
array_7=np.eye(5) #创建5*5的单位矩阵
array_3
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
array_4
array([1, 3, 5, 7, 9])
array_5
array([0., 0., 0., 0., 0.])
array_6
array([[0., 0., 0.],
[0., 0., 0.]])
array_7
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
array_2.shape # 数组的维度
(2, 4)
array_2.size # 数组元素的个数
8
array_2.dtype #数组元素的数据类型
dtype('int64')
array_3[1]#访问第1个元素
2
array_3[2:4] #访问第2到3个元素
array([3, 4])
array_2[1,2] #访问第1行,第2个元素
7
array_2[1][2] #访问第1行,第2个元素
7
array_8=np.array([[1,2,3],[4,5,6],[7,8,9]])
#切片
array_8[:2,1:] #从第0行到第2行,从第1列到最后一列
array([[2, 3],
[5, 6]])
array_7=np.eye(5)
# Array与Matrix(附录)
import numpy as np
np.random.randn(10) #创建一个10个元素的1维数组
array([ 0.42493784, -1.00915342, -0.94640226, 0.60185647, 0.54586824,
0.69668488, -0.8211607 , 0.23638224, -0.62685731, -2.0602249 ])
np.random.randint(10) # 创建一个10以内的数据整数
7
np.random.randint(10,size=10) # 创建一个10以内的10个元素的一维的整数数组
array([4, 1, 8, 0, 9, 4, 7, 8, 0, 7])
np.random.randint(10,size=(2,3)) # 创建一个10以内的2*3的二维的整数数组
array([[1, 6, 0],
[9, 9, 8]])
np.random.randint(10,size=20).reshape(4,5) # 创建一个10以内的20个元素的一维的整数数组,转化为4*5的二维数组
array([[8, 8, 9, 7, 9],
[2, 7, 0, 7, 2],
[2, 8, 6, 5, 7],
[4, 4, 8, 5, 5]])
# 数组的运算
a=np.random.randint(10,size=20).reshape(4,5)
b=np.random.randint(10,size=20).reshape(4,5)
a
array([[5, 1, 0, 3, 6],
[0, 6, 4, 2, 8],
[2, 5, 2, 8, 2],
[0, 3, 1, 2, 7]])
b
array([[9, 8, 3, 6, 6],
[6, 1, 8, 9, 0],
[5, 6, 3, 8, 5],
[3, 7, 7, 7, 7]])
a+b
array([[14, 9, 3, 9, 12],
[ 6, 7, 12, 11, 8],
[ 7, 11, 5, 16, 7],
[ 3, 10, 8, 9, 14]])
a-b
array([[-4, -7, -3, -3, 0],
[-6, 5, -4, -7, 8],
[-3, -1, -1, 0, -3],
[-3, -4, -6, -5, 0]])
a*b
array([[45, 8, 0, 18, 36],
[ 0, 6, 32, 18, 0],
[10, 30, 6, 64, 10],
[ 0, 21, 7, 14, 49]])
a/b
/tmp/ipykernel_5901/1348051284.py:1: RuntimeWarning: divide by zero encountered in divide
a/b
array([[0.55555556, 0.125 , 0. , 0.5 , 1. ],
[0. , 6. , 0.5 , 0.22222222, inf],
[0.4 , 0.83333333, 0.66666667, 1. , 0.4 ],
[0. , 0.42857143, 0.14285714, 0.28571429, 1. ]])
# matrix
np.mat([[1,2,3],[4,5,6]])
matrix([[1, 2, 3],
[4, 5, 6]])
np.mat(a) #通过二维数组创建
matrix([[5, 1, 0, 3, 6],
[0, 6, 4, 2, 8],
[2, 5, 2, 8, 2],
[0, 3, 1, 2, 7]])
# 矩阵的运算
A = np.mat(a)
B = np.mat(b)
A
matrix([[5, 1, 0, 3, 6],
[0, 6, 4, 2, 8],
[2, 5, 2, 8, 2],
[0, 3, 1, 2, 7]])
B
matrix([[9, 8, 3, 6, 6],
[6, 1, 8, 9, 0],
[5, 6, 3, 8, 5],
[3, 7, 7, 7, 7]])
A+B
matrix([[14, 9, 3, 9, 12],
[ 6, 7, 12, 11, 8],
[ 7, 11, 5, 16, 7],
[ 3, 10, 8, 9, 14]])
A-B
matrix([[-4, -7, -3, -3, 0],
[-6, 5, -4, -7, 8],
[-3, -1, -1, 0, -3],
[-3, -4, -6, -5, 0]])
A1=np.mat(np.random.randint(10,size=20).reshape(5,4))
B1=np.mat(np.random.randint(10,size=20).reshape(4,5))
A1
matrix([[2, 8, 7, 5],
[4, 1, 4, 4],
[5, 1, 0, 3],
[9, 6, 4, 2],
[2, 6, 4, 5]])
B1
matrix([[1, 4, 7, 9, 2],
[7, 4, 3, 3, 0],
[6, 8, 9, 3, 7],
[9, 7, 4, 6, 8]])
A1*B1
matrix([[145, 131, 121, 93, 93],
[ 71, 80, 83, 75, 68],
[ 39, 45, 50, 66, 34],
[ 93, 106, 125, 123, 62],
[113, 99, 88, 78, 72]])
a1=np.random.randint(10,size=20).reshape(4,5)
a1
array([[6, 1, 1, 7, 7],
[7, 0, 7, 1, 3],
[4, 7, 6, 9, 7],
[6, 6, 6, 2, 0]])
np.unique(a1) #计算a中唯一的元素
array([0, 1, 2, 3, 4, 6, 7, 9])
sum(a1) #计算每一列的元素和
array([23, 14, 20, 19, 17])
a2=np.random.randint(10,size=8).reshape(4,2)
a2
array([[6, 8],
[5, 1],
[5, 5],
[4, 3]])
np.unique(a2)
array([1, 3, 4, 5, 6, 8])
sum(a1[:,0]) #从上到下计算第一列的元素和
23
a1.max() #计算a中的最大值
9
a2.max()
8
max(a1[0]) #计算a中第一行的最大值
7
max(a2[0])
8
max(a1[:,0]) #从上到下计算第一列的元素最大值
7
max(a2[:,0]) #从上到下计算第一列的元素最大值
6
# Array 的input和output操作(附录)
# 使用pickle序列化numpy array
import pickle
import numpy as np
x = np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
f = open('x.pkl','wb')
pickle.dump(x,f)
!ls
ArrayOpt .ipynb Matrix.ipynb x.pkl
Array 的input和output操作.ipynb nohup.out
f=open('x.pkl','rb')
b=pickle.load(f)
b
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.save('one_array',x)
!ls
ArrayOpt .ipynb Matrix.ipynb one_array.npy
Array 的input和output操作.ipynb nohup.out x.pkl
t=np.load('one_array.npy')
t
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
y=np.arange(20)
y
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19])
np.savez('two_array.npz',a=x,b=y)
!ls
ArrayOpt .ipynb Matrix.ipynb one_array.npy x.pkl
Array 的input和output操作.ipynb nohup.out two_array.npz
c=np.load('two_array.npz')
c
<numpy.lib.npyio.NpzFile at 0x7f1e8c392c90>
c['a']
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
c['b']
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19])
← Jupyter是什么 scipy →