数组属性
#设定种子值,使每次得到相同随机数组
np.random.seed(1)
x1=np.random.randint(10,size=6) #一维数组
x2=np.random.randint(10,size=(3,4)) #二维数组
x3=np.random.randint(10,size=(3,4,5)) #三维数组
print("x3的维度:",x3.ndim)
print("x3每个维度的大小:",x3.shape)
print("x3的总大小:",x3.size)
print("x3的数据类型",x3.dtype)
print("x3每个元素的字节大小",x3.itemsize,'bytes')
print("x3的总字节大小",x3.nbytes,'bytes')
'''
运行结果
x3的维度: 3
x3每个维度的大小: (3, 4, 5)
x3的总大小: 60
x3的数据类型 int32
x3每个元素的字节大小 4 bytes
x3的总字节大小 240 bytes
'''
数组索引
#一维数组索引
print(x1)
print(x1[0],x1[4])
print(x1[-1],x1[-2]) #从末尾索引,-1为最后一个元素
#多维数组索引
print(x2)
print(x2[0,0],x2[-1,-1])
'''
运行结果
[5 8 9 5 0 0]
5 0
0 0
[[1 7 6 9]
[2 4 5 2]
[4 2 4 7]]
1 7
'''
数组切片
注意:Numpy中数组切片返回的是视图,即修改切片后的数组影响原始数组。而python列表切片返回的是副本,修改切片不会影响原始数组。
#一维数组切片
x1[start:stop:step]
#多维数组切片
x2[start:stop:step,start:stop:step]
#创建数组的副本
x2_sub_copy=x2[:2,:2].copy()
一维数组切片
#一维数组切片
x=np.arange(10)
print(x)
print(x[:5]) #前五个元素
print(x[5:]) #索引五后的元素
print(x[4:7]) #索引[4,7)的元素
print(x[::2]) #每隔一个元素
print(x[1::2]) #每隔一个元素,从索引一开始
print(x[::-1]) #逆序
print(x[5::-2]) #从索引五开始每隔一个元素逆序
'''
运行结果
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4]
[5 6 7 8 9]
[4 5 6]
[0 2 4 6 8]
[1 3 5 7 9]
[9 8 7 6 5 4 3 2 1 0]
[5 3 1]
'''
多维数组切片
'''
#多维数组切片
x2=np.random.randint(10,size=(3,4))
print(x2)
print(x2[:2,:3]) #两行三列
print(x2[:3,::2]) #所有行,每隔一列
print(x2[::-1,::-1]) #行和列同时逆序
print(x2[:,0]) #第一列
print(x2[0,:]) #第一行
print(x2[0]) #等于x2[0,:]
运行结果
[[0 8 7 7]
[1 1 3 0]
[8 6 4 5]]
[[0 8 7]
[1 1 3]]
[[0 7]
[1 3]
[8 4]]
[[5 4 6 8]
[0 3 1 1]
[7 7 8 0]]
[0 1 8]
[0 8 7 7]
[0 8 7 7]
'''
创建副本
#创建副本,并对其修改
x=np.arange(10)
print(x)
x_sub_copy=x[:2] #创建副本
print(x_sub_copy)
x_sub_copy[0]=99
print(x_sub_copy)
print(x) #副本修改后影响原始数组
'''
运行结果
[0 1 2 3 4 5 6 7 8 9]
[0 1]
[99 1]
[99 1 2 3 4 5 6 7 8 9]
'''
数组变形
#数组变形
x=np.arange(9).reshape((3,3))
print(x)
#一维数组转换成二维行或列的矩阵
x=np.array([1,2,3])
print(x)
print(x.reshape((1,3))) #行向量
print(x[np.newaxis,:]) #通过newaxis获得的行向量
print(x.reshape((3,1))) #列向量
print(x[:,np.newaxis]) #通过newaxis获得的列向量
'''
运行结果
[1 2 3]
[[1 2 3]]
[[1 2 3]]
[[1]
[2]
[3]]
[[1]
[2]
[3]]
'''
数组拼接
#一维数组拼接
x=np.array([1,2,3])
y=np.array([3,2,1])
print(np.concatenate([x,y]))
#二维数组拼接
grid=np.array([[1,2,3],
[4,5,6]])
print(np.concatenate([grid,grid])) #按第一个轴拼接
print(np.concatenate([grid,grid],axis=1)) #按第二个轴拼接
#垂直栈、水平栈
x=np.array([1,2,3])
grid=np.array([[9,8,7],
[6,5,4]])
print(np.vstack([x,grid])) #垂直栈数组,增加行
y=np.array([[99],
[99]])
print(np.hstack([y,grid])) #水平栈数组,增加列
z=np.array([4,5,6])
'''
运行结果
[1 2 3 3 2 1]
[[1 2 3]
[4 5 6]
[1 2 3]
[4 5 6]]
[[1 2 3 1 2 3]
[4 5 6 4 5 6]]
[[1 2 3]
[9 8 7]
[6 5 4]]
[[99 9 8 7]
[99 6 5 4]]
'''
数组分裂
#数组分裂
x=[1,2,3,99,99,3,2,1]
x1,x2,x3=np.split(x,[3,5]) #[3,5]是索引,表示分裂点的位置
print(x1,x2,x3)
grid=np.arange(16).reshape((4,4))
print(grid)
upper,lower=np.vsplit(grid,[2]) #按行分裂
print(upper)
print(lower)
left,right=np.hsplit(grid,[2]) #按列分裂
print(left)
print(right)
'''
运行结果
[1 2 3] [99 99] [3 2 1]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
[[0 1 2 3]
[4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]
[[ 0 1]
[ 4 5]
[ 8 9]
[12 13]]
[[ 2 3]
[ 6 7]
[10 11]
[14 15]]
'''