导入numpy库,并查看numpy版本
import numpy as np
np.__version__
一、创建Array
1.使用np.array()由python列表创建
list1 = [1, 2, 3, 4, 5]
n1 = np.array(list1)
n1
array([1, 2, 3, 4, 5])
numpy默认ndarray的所有元素类型是相同的
如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int
list2 = [1, 2, 3.3, 4.4, 5]
n2 = np.array(list2)
n2
array([1. , 2. , 3.3, 4.4, 5. ])
l3 = ["helloworld",1,2,3.3]
n3 = np.array(l3)
n3
array(['helloworld', '1', '2', '3.3'], dtype='
2.使用numpy的routines函数创建
常见的创建方法
np.ones(shape,dtype=None,order='C')
np.ones(shape=(3, 5), dtype=np.int)
以1填充
array([ [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1] ])
np.zeros(shape, dtype=float, order='C')
以0填充
np.zeros(shape=(3,3))
array([ [0., 0., 0.], [0., 0., 0.], [0., 0., 0.] ])
np.full(shape, fill_value, dtype=None, order='C')
以指定内容填充
np.full(shape=(3,3), fill_value=6)
array([ [6, 6, 6], [6, 6, 6], [6, 6, 6] ])
np.eye(N, M=None, k=0, dtype=float)
对角线为1其他的位置为0,k为偏移量
np.eye(N=3,k=-1)
array([ [0., 0., 0.], [1., 0., 0.], [0., 1., 0.] ])
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
生成从start到stop的长度为num的等差数列,endpoint表示数列是否包含stop,retstep表示生成的数列中是否包含步长
np.linspace(0, 10, num=11, endpoint=True)
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
np.arange(start, stop, step, dtype=None)
从start(默认0)到stop(不包含stop),以步长step取值填充返回一维数组
np.arange(0,12,step=2)
array([ 0, 2, 4, 6, 8, 10])
np.random.randint(low, high=None, size=None, dtype='l')
以随机数填充,low为最小值,high为最大值
np.random.randint(1,10,size=(2,2))
array([ [9, 6], [1, 3] ])
正态分布函数
- np.random.randn(d0, d1, ..., dn) 标准正态分布
- np.random.normal() 普通正态分布
np.random.random(size=None)
生成0到1的随机数,左闭右开
np.random.random(size=(3,4))*2-1 # 生成-1到1的正态分布
二、ndarray的属性
- ndim:维度
- shape:形状(各维度的长度)
- size:总长度
- dtype:元素类型
- itemsize:每个元素占的字节数,每个元素的大小
- flags:内存信息
- real:数组元素的实部
- imag:数据元素的虚部
- data:包含矩阵直的缓冲区地址
三、ndarray的基本操作
1.索引
n = np.array([[27, 88, 5, 49, 97],
[91, 32, 62, 5, 95],
[41, 9, 12, 16, 94],
[ 4, 35, 25, 57, 5 ],
[48, 60, 96, 59, 18]])
间接访问:n[1][2]
直接访问:n[1, 2]
只读时可以用间接访问,赋值时必须使用直接访问
行访问: n[2]
---> array([41, 9, 12, 16, 94])
列访问: n[:,1]
---> array([88, 32, 9, 35, 60])
访问多个元素: n[1:3, 1:3]
--->array([[32, 62], [ 9, 12]])
可使用列表作为索引取值
n[[1, 2], 1]
--->array([32, 9])
n2[[1,2]][:,[1,3]]
--->array([[32, 5], [ 9, 16]])
使用bool列表对array进行访问,True对应的值会被返回,bool列表的长度必须和该维度匹配
n1 = np.array(['A', 'B', 'C', 'D', 'E'])
index = [True, False, True, False, False]
n1[index]
---> array(['A', 'C'], dtype='
总结:
- numpy可以保持与python列表的访问方法,但是要注意高维数组的访问可能存在潜在风险
- 多维数组直接访问元素: 以列表的方式表示索引 [d0_loc, d1_loc, d2_loc...]
- 多维数组的行访问: n[row_index], 访问多行: n[[row_index1, row_index2...]]
- 多维数组的列访问: n[col_index], 访问多列: n[[col_index1, col_index2...]]
- BOOL列表访问:
行访问: n[BOOLLIST]
列访问: n[:,BOOLLIST]
【注意】 BOOLLIST的长度必须与访问的维度的长度一致
2.切片
切片操作原理与python列表的切片相同,即arr[start: end: step]
n1 = np.array(['A', 'B', 'C', 'D', 'E'])
n1[1:4]
--->array(['B', 'C', 'D'], dtype='
n = np.array([[27, 88, 5, 49, 97],
[91, 32, 62, 5, 95],
[41, 9, 12, 16, 94],
[ 4, 35, 25, 57, 5 ],
[48, 60, 96, 59, 18]])
n[0:2, 1:3]
--->array([ [88, 5], [32, 62] ])
n2 = np.array([11, 49, 83, 80, 26, 44, 46, 85, 50, 89])
n2[ : :2]
--->array([11, 83, 26, 46, 50])
n2[ : :-1]
--->array([89, 50, 85, 46, 44, 26, 80, 83, 49, 11])
3.变形
n.reshape(5, 4)
--->array([[47, 4, 77, 86],
[26, 62, 88, 86],
[55, 88, 40, 4],
[18, 22, 10, 18],
[43, 50, 60, 48]])
n.reshape(-1,1)
--->array([[47],[ 4],[77],[86],[26],[62], [88],[86],[55],[88],[40],[ 4],[18],[22],[10], [18],[43],[50], [60],[48]])
4.级联
np.concatenate() 级联需注意的点:
- 级联的参数是列表:一定要加中括号或小括号
- 维度必须相同
- 形状相符
- 级联的方向默认是shape中的第一个值所代表的维度方向
- 可通过axis参数改变级联的方向
n1 = np.random.randint(0, 100, size=(5, 5))
n2 = np.random.randint(0, 100, size=(5, 5))
display(n1, n2)
np,concatenate([n1, n2], axis=1)
np.hstack 水平级联 (横向)
np.vstack 垂直级联 (纵向)
5.切分
与级联相似,三个函数完成切分工作:
- np.split
- np.vsplit
- np.hsplit
n1 = np.random.randint(0,100,size=(6,6))
a1, a2, a3 = np.split(n1, indices_or_sections=3, axis=0)
display(a1, a2, a3)
n2 = np.random.randint(0,100,size=(5,7))
a1, a2, a3 = np.split(n2, indices_or_sections=[2,3], axis=0) # 0:2 2:4 4:
display(a1, a2, a3)