1.1 numpy数组的各种变换操作

目录

通过索引和切片访问一维数组

切片替换

调整步长

通过索引和切片访问二维数组

位置选取数据

布尔索引

where函数替换值

数组重塑

修改维度:reshape和resize

展开方法:revel和flatten

数组叠加:hstack、vstack、concatenate

数组分割:hsplit、vsplit、split


通过索引和切片访问一维数组

创建数组

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]])]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀不及你心凉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值