目录
数组叠加:hstack、vstack、concatenate
通过索引和切片访问一维数组
创建数组
import numpy as np
arr=np.arange(10)
print(arr)
结果:
[0 1 2 3 4 5 6 7 8 9]
第一层括号直接冒号切片,无第二层括号
print('用整数做下标获取数组元素',arr[4])
print('用范围作为下标获取数组的一个切片',arr[3:5])
print('省略开始下标,从a[0]开始',arr[:5])
print('使用负数下标',arr[-2])
结果:
用整数做下标获取数组元素 4
用范围作为下标获取数组的一个切片 [3 4]
省略开始下标,从a[0]开始 [0 1 2 3 4]
使用负数下标 8
切片替换
arr[2:4]=66,77
print(arr)
结果:
[ 0 1 66 77 4 5 6 7 8 9]
调整步长
根据正整数/负整数进行正向/反向取数组
print("根据起始位置和步长取数据",arr[0:8:2])
print('负步长反向取数据',arr[6:0:-2])
结果:
根据起始位置和步长取数据 [ 0 66 4 6]
负步长反向取数据 [ 6 4 66]
通过索引和切片访问二维数组
arr=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
print('索引行:',arr[1])
print('索引连续多行:',arr[0:2])
print('索引不连续多行:',arr[[0,2]])
结果:
索引行: [5 6 7 8]
索引连续多行: [[1 2 3 4]
[5 6 7 8]]
索引不连续多行: [[ 1 2 3 4]
[ 9 10 11 12]]
位置选取数据
# 索引某行某列,逗号分割,行列规则同上
# 单个数字索引某个数
print(arr[0,3])
# 连续行列切片,索引一块数据
print('索引第0行第2,3列元素:\n',arr[0,2:4])
print("索引第1,2行中的第2-3列:\n",arr[1:3,2:4])
# 不连续行列用list,索引零散数据
print('索引零散数据:\n',arr[[0,2],[0,2]])
print('从两个序列的对应位置取出两个整数来组成下标,索引结果为:\n',arr[((0,1,2),(1,2,3))])
# print(arr[1:,(0,2,3)])
结果:
4
索引第0行第2,3列元素:
[3 4]
索引第1,2行中的第2-3列:
[[ 7 8]
[11 12]]
索引零散数据:
[ 1 11]
从两个序列的对应位置取出两个整数来组成下标,索引结果为:
[ 2 7 12]
布尔索引
按照索引位置筛选
# 生成Bool数组
mask = np.array([1,0,1],dtype = np.bool)
#mask是一个布尔数组,它索引第1、3行中第2列的元素
print('索引结果为:',arr[mask,2])
结果:
索引结果为: [ 3 11]
按照判断条件筛选
#筛选出符合条件的数。例 <10的数
arr2 = np.arange(24).reshape(4,6)
print(arr2<10)
arr3 = arr2<10
print(arr2[arr3])
print(arr2[(arr2<15 ) & (arr2>10)])
# arr2[[True,False,False,False]]
结果:
[[ True True True True True True]
[ True True True True False False]
[False False False False False False]
[False False False False False False]]
[0 1 2 3 4 5 6 7 8 9]
[11 12 13 14]
where函数替换值
# 函数实现值替换
#where函数
a2 = np.random.randint(0,10,size=(3,5))
print(a2)
result = np.where(a2<6,0,1)
print(result)
结果:
[[6 9 1 2 4]
[3 5 2 1 8]
[9 8 1 0 0]]
[[1 1 0 0 0]
[0 0 0 0 1]
[1 1 0 0 0]]
数组重塑
修改维度:reshape和resize
reshape后可赋值,两者不同步。
#使用reshape改变数组形态,不改变原值;
arr=np.arange(12)
print('创建的一维数组为:',arr)
arr2=arr.reshape(3,4)
print('新数组为:\n',arr2)
print('原数组未改变:\n',arr)
结果:
创建的一维数组为: [ 0 1 2 3 4 5 6 7 8 9 10 11]
新数组为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
原数组未改变:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
resize后不可赋值,直接修改原数组。
# resize直接修改原数组,无返回值
arr=np.arange(12)
print('创建的一维数组为:',arr)
arr2=arr.resize(3,4)
print('新数组为:\n',arr2)
print('原数组改变:\n',arr)
结果:
创建的一维数组为: [ 0 1 2 3 4 5 6 7 8 9 10 11]
新数组为:
None
原数组改变:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
展开方法:revel和flatten
revel赋值后两者若修改会同步。
#使用ravel函数展平数组,不改变原值,返回引用
arr=np.arange(12).reshape(3,4)
print('创建的数组为:\n',arr)
arr3=arr.ravel()
print('展平后的数组为:',arr3)
print('原数组为:\n',arr)
arr3[0]=100
arr
结果:
创建的数组为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
展平后的数组为: [ 0 1 2 3 4 5 6 7 8 9 10 11]
原数组为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
array([[100, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
flatten赋值后两者修改不同步,且可以按照行或者列进行展开。
#使用flatten函数展平数组,可设置方向,不改变原值,返回拷贝
arr=np.arange(12).reshape(3,4)
print('创建的二维数组为:\n',arr)
arr3=arr.flatten('F')#默认为A,按行方向降维,F按列
print('纵向展平后的数组为:',arr3)
arr3[0]=100
arr
结果:
创建的二维数组为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
纵向展平后的数组为: [ 0 4 8 1 5 9 2 6 10 3 7 11]
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
数组叠加:hstack、vstack、concatenate
hstack横向拼接,vstack纵向拼接
#使用hstack函数实现数组横向组合
arr1=np.arange(12).reshape(3,4)
print('创建的数组1为:\n',arr1)
arr2=arr1*3
print('创建的数组2为:\n',arr2)
print('横向组合为:\n',np.hstack((arr1,arr2)))# horizontal水平方向叠加
print('纵向组合为:\n',np.vstack((arr1,arr2)))# vertical垂直方向叠加
结果:
创建的数组1为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
创建的数组2为:
[[ 0 3 6 9]
[12 15 18 21]
[24 27 30 33]]
横向组合为:
[[ 0 1 2 3 0 3 6 9]
[ 4 5 6 7 12 15 18 21]
[ 8 9 10 11 24 27 30 33]]
纵向组合为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[ 0 3 6 9]
[12 15 18 21]
[24 27 30 33]]
concatenate根据参数axis,为1则横向拼接,为0则纵向拼接。
#使用concatenate函数合并,设置参数axis=1按横轴组合,axis=0按纵轴组合 默认为0
print('横向组合为:\n',np.concatenate((arr1,arr2),axis=1))
print('纵向组合为:\n',np.concatenate((arr1,arr2),axis=0))
结果:
横向组合为:
[[ 0 1 2 3 0 3 6 9]
[ 4 5 6 7 12 15 18 21]
[ 8 9 10 11 24 27 30 33]]
纵向组合为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[ 0 3 6 9]
[12 15 18 21]
[24 27 30 33]]
注意concatenate参数axis为None时可以合并展开(全连接),这个在深度学习里面图像处理方面有着重要作用!!!
print('拼接后扁平化:',np.concatenate((arr1,arr2),axis=None))# 先叠加再扁平化.默认为None,表示将数组扁平化(平铺)并连接成一个一维数组。如果指定了axis,则表示沿着指定的轴进行连接。
结果:
纵向组合为: [ 0 1 2 3 4 5 6 7 8 9 10 11 0 3 6 9 12 15 18 21 24 27 30 33]
数组分割:hsplit、vsplit、split
hsplit横向切割,vsplit纵向切割。参数若为int,表示平均分割数,为list,表示按照列表索引位置分割
#使用hsplit、vsplit函数实现数组横向分割(horizontal)、纵向分割(vertical)
arr=np.arange(16).reshape(4,4)
print('创建的二维数组为:\n',arr)
print('横向分割:\n',np.hsplit(arr,2))#横向分割,第二个参数:平均分割的个数
print('纵向分割:\n',np.vsplit(arr,2))#纵向分割
# 任意位置切割
print('横向任意位置分割为:\n',np.hsplit(arr,[1,2]))#第二个参数用列表或元组给出切割的位置
#纵向切割同理
结果:
创建的二维数组为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
横向分割:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
纵向分割:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
横向任意位置分割为:
[array([[ 0],
[ 4],
[ 8],
[12]]), array([[ 1],
[ 5],
[ 9],
[13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
split根据参数axis,为1横向切割,为0纵向切割
#使用split函数实现数组分割,设置axis参数设置方向
print('横向分割:',np.split(arr,2,axis=1))
print('纵向分割:',np.split(arr,2,axis=0))
结果:
横向分割: [array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
纵向分割: [array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]