Numpy初学
一、数据的创建
** 1. 手动创建 **
import numpy as np
arr_1=np.array([1,2,3])
arr_1
一维数组可直接与标量相乘
arr_a*3
array([3, 6, 9])
** 注:**
创建数组时,其元素必须有相同的结构,尽量定义为浮点型
arr_b=np.array((1,2),dtype=np.float64)
arr_b
array([1., 2.])
** 2. dtype关键字 **
用作查询数组的类型
既可以作为方法,又可以作为参数关键字
** 3. shape **
用作查询数组的外形
一位数组的数组外形
arr_b=np.array((1,2,3,4))
arr_c.shape
(3,)
二维数组的数组外形
arr_b=np.array([[1,2,3],[4,5,6]])
arr_b.shape
(2, 3)
2代表行 3代表列
二、自动创建数组
1. linspace函数
np.linspace(start,stop,num=50,endpoint=True)
特点:
默认包括结束值。如果endpoint=false ,不包括结束值
arr_1=np.linspace(1,10,20)
arr_1
array([ 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. arange函数
arange([start,] stop[, step,], dtype=None)
特点:
默认前闭后开,不包括结束值
step表示步长
arr_2=np.arange(1,10,2)
arr_2
array([1, 3, 5, 7, 9])
3. randint函数
randint(low, high=None, size=None, dtype=‘l’)
ar1=np.random.randint(‘开始数字’,‘结束数字’,‘几个数字’)#一维数组
ar2=np.random.randint(‘开始数字’,‘结束数字’,(‘行数’,‘列数’))
用array_like来赋值
ar1[1:3,1]=[[0,1,2],[3,4,5]]
特点:
前闭后开,size可以创建多种维度的数组
arr_3=np.random.randint(1,10,(2,3))
arr_3
array([[6, 8, 7],
[4, 2, 8]])
4. 一维数组与二维数组的创建
1. reshape
np.reshape(a, newshape, order=‘C’)
arr_1=np.random.randint(1,10,6)
(array([3, 8, 1, 3, 9, 3])
arr_1.reshape(2,3)
** 注意:**
reshape中书写的行和列相乘必须和转换之前的个数一致,要不会报错
2. ravel函数
转换为一维数组
np.ravel(a, order=‘C’)
arr_2=np.random.randint(1,10,(2,3))
array([[3, 7, 4],
[5, 5, 9]]))
arr_2.ravel()
np.ravel(arr_2)
array([3, 7, 4, 5, 5, 9])
上述两种方法均可以转换
一个是作为属性
一个是作为函数
3. 数据的网格化
np.meshgrid(*xi, **kwargs)
x=np.linspace(1,10,5)
y=np.linspace(2,16,5)
x,y
(array([ 1. , 3.25, 5.5 , 7.75, 10. ]),
array([ 2. , 5.5, 9. , 12.5, 16. ]))
np.meshgrid(x,y)
[array([[ 1. , 3.25, 5.5 , 7.75, 10. ],
[ 1. , 3.25, 5.5 , 7.75, 10. ],
[ 1. , 3.25, 5.5 , 7.75, 10. ],
[ 1. , 3.25, 5.5 , 7.75, 10. ],
[ 1. , 3.25, 5.5 , 7.75, 10. ]]),
array([[ 2. , 2. , 2. , 2. , 2. ],
[ 5.5, 5.5, 5.5, 5.5, 5.5],
[ 9. , 9. , 9. , 9. , 9. ],
[12.5, 12.5, 12.5, 12.5, 12.5],
[16. , 16. , 16. , 16. , 16. ]])]
实现数据更精细的划分
三、 特殊数组的创建与应用
1. 0数组的创建
zeros(shape, dtype=float, order='C')
b=np.zeros(4)
b
array([0., 0., 0., 0.])
a=np.zeros((2,3))
a
array([[0., 0., 0.],
[0., 0., 0.]])
2. 1数组的创建
同理
a=np.ones(3)
a
array([1., 1., 1.])
3.空数组的创建–空数组不能为空,可装载数据
a=np.empty((2,10000))
empty括号中书写行和列
a
array([[1.38677544e-311, 1.38681424e-311, 2.12199579e-314, ...,
0.00000000e+000, 0.00000000e+000, 0.00000000e+000],
[0.00000000e+000, 0.00000000e+000, 0.00000000e+000, ...,
0.00000000e+000, 0.00000000e+000, 0.00000000e+000]])
真空数组的创建
a=np.array([])
4.单位矩阵的创建–只有二维
a=np.identity(个数)
a=np.identity(3)
a
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
四、类似矩阵的创建
1. zeros_like
b=np.linspace(1,10,5)
a=np.zeros_likes(b)
2.empty_like
a=np.linspace(1,10,2)
b=np.empty_likes(a)
3.ones_like
a=np.linspace(1,10,4)
b=np.ones_like(a)
五、类型转换
numpy的类型
int8,int16,int32,int64
float16,float32,float64,float128
complex64,complex128,complex256
bool,object,string_,unicode
a=np.astype('int')
a.dtype='int' × 不能转
六、数组的并行计算(批次量运算,向量性运算)
a=np.random.randint(1,10,5)
b=np.random.randint(2,28,5)
a,b
(array([4, 9, 4, 9, 9]), array([19, 10, 13, 27, 8]))
a+b
array([23, 19, 17, 36, 17])
** 注意:**
相加的两个数组的个数必须一致
一对一,相同位置的相加按照标量计算
二维数组的并行计算等同于标量计算
七、索引 切片 选区
1.索引
a=np.random.randint(1,10,5)
a[0]
2. 选区
a=np.random.randint(1,10,5)
a[1:4]
精准定位赋值
ar1[3:4][4:4]=1000
3. 切片
a=np.random.randint(1,10,5)
b=a[1:4]
注意:
切片与选区的区别:
切片是选区选择完之后赋值给一个新的变量
而选区仅仅是在原数组上选择一块区域
切片改变,原数组改变,可以通过copy函数来避开这一特性
八、源数据的保护
1. 广播赋值
arr=np.random.randint(1,10,(2,3))
arr[1:,1:]='12'
2. 数组类似赋值–array_like
arr=np.random.randint(1,10,(6,4))
arr[1:3,1:]=[[0,1,2],[3,4,5]]
3. 精确定位赋值
arr=np.random.randint(1,10,(2,3))
arr[1,2]=-100
九、布尔值当索引
1. 一维数组
arr=np.random.randint(1,10,5)
arr[arr>3]
arr[(arr>0)&(arr<8)]
2.二维数组
arr=np.random.randint(1,10,(2,4))
arr[(arr>3)&(arr<6)]
arr[1]>5 -------->把第一行》5的数据取出来
arr[:,arr[1]>5]---------->把》5的列为true取出来
十、花式索引—索引必须是二维
arr=np.random.randint(1,10,(6,5))
arr[[3]] ==arr[[1],:]
arr[[2,4]] ---->取任意的行数 ==arr[[1,2],:]
arr[:,[2,3,4]]----->取任意的列数
arr[[1,3],[2,4]]---->选取的行的个数与列数必须一致1--2,3--4
arr[[1,2,3]][:,[2,4,1]] ---先选取行数,在选取列数
arr[np.ix_([1,2,3],[2,4,1])]
十一、转置矩阵
行和列数一直时,根据对角线调换位置
不一致时,第一列转为第一行,第二列转为第二行
十二、矩阵相乘
a是3行5列
b是5行2列
a*b==>c[1][1]==>a[1][1]*b[1][1]+a[1][2]*b[2][1]…以此列推
注意:
两矩阵相乘a的行数必须与b的列数一致才可以相乘
np.dot(a,b)----------------->numpy自带的函数