Numpy(二) 元素与数组的操作
一、元素的索引访问
1.一维数组索引访问
①Numpy一维数组索引访问与python内置序列类型索引访问一样,都使用中括号+下标([index])
②正值索引/负值索引
正值索引:0 1 2 3 4 5
a数组: 【1,2,3,4,5,6】
复制索引:0 -5 -4 -3 -2 -1
*正值索引:第一个元素为a[0]其余依次排序,第n个元素为a[n-1] 负值索引:第一个元素依旧为a[0]其余元素从后往前依次减小1,最后一个元素为a[-1],第二个元素为a[-(n-1)]
2.一维数组索引访问的操作、
import numpy as np
a=np.array([1,2,3,4,5,6])
print('正值索引第五个元素:',a[4])
print('负值索引倒数第二个元素:',a[-2])
正值索引第五个元素: 5
负值索引倒数第二个元素: 5
2.二维数组的索引访问
A.两种语法规则
①表达式1:np.array[所在0轴索引] [所在1轴索引] 表达式2:np.array[所在0轴索引,所在1轴索引]
*0轴为行,1轴为列
B.操作
①第一种表示方法查询6号元素
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a)
print('正值索引为:',a[1][2])
'6号元素正值索引为[1][2]'
print('负值索引为:',a[-2][-1])
'6号元素负值索引为:[-2][-1]'
正值索引为: 6
负值索引为: 6
②第二种索引方法索引6号元素
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a)
print('正值索引:',a[1,2])
print('负值索引:',a[-2,-1])
[[1 2 3]
[4 5 6]
[7 8 9]]
正值索引: 6
负值索引: 6
二、切片访问
1.一维数组的切片访问
①Numpy一维数组的切片访问与python内置序列切片操作方法一样。切片运算有两种形式:
1.[start:end]————start是开始索引的位置,end是结束索引前一个元素的位置(不包含end位置上的元素),由开始到结束直接切片下来。
2.[start:end:step]——start是开始索引的位置,end是结束索引前一个元素的位置(不包含end位置上的元素),step为步长,不尝试切片是获取元素的间隙。步长可以选择正整数也可以选择负整数。
②两种方式的切片访问
A.第一种方式选取第3位至第6位的元素
import numpy as np
a=np.array([1,2,3,4,5,6,7,8,9,10])
print('选取的第3号到第六号元素为:',a[3:6])
选取的第3号到第六号元素为: [4 5 6]————下角标为6号的元素为7,但是不包含end位置的元素故最后一位为a[end-1](6)
B.第二种方式选取2到8位的元素,步长为2
import numpy as np
a=np.array([1,2,3,4,5,6,7,8,9,10])
print('选取2到8位的元素,步长为2的元素为::',a[2:8:2])
选取2到8位的元素,步长为2的元素为:: [3 5 7]
2.二维数组的切片访问
①二维数组的切片访问主要是以轴进行切片访问,先0轴后1轴。
②语法规则:
np.array[所在0轴上的切片,所在1轴上的切片]
③实例
给出5*5的数组
0 1 2 3 4
0[ 1 2 3 4 5]
1[ 6 7 8 9 10]
2[11 12 13 14 15]
3[16 17 18 19 20]
4[21 22 23 24 25]
A.找出[7,8,9],[12,13,14],[17,18,19],[22,23,24]
tips:0轴上切片[1:5],1轴上切片[1:4]
import numpy as np
a=np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25]])
print(a[1:5,1:4])
[[ 7 8 9]
[12 13 14]
[17 18 19]
[22 23 24]]
B.找[13,14]
tips:0轴上固定值2,1轴上切片[2:4]
import numpy as np
a=np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25]])
print(a[2,2:4])
print(a)
[13 14]
三、布尔索引
1.为了从数组中过滤我们想要的元素,可以使用布尔索引。
2.一维数组的布尔索引
①创建一个一维数组[1,2,3,4,5,6]
②创建一维布尔数组[True,True,Flase,True,Flase,True]
③对比,得出数据
import numpy as np
a=np.array([1,2,3,4,5,6])
b=np.array([True,True,False,True,False,True])
print(a[b])
3.二维数组的布尔索引
①创建一个二维数组
②创建二维布尔数组
③对比,得出数据
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=np.array([[True,False,True],[False,False,False],[True,False,False]])
print(a[b])
[1 3 7]
*布尔数组必须与索引数组的形状相同!
四、数组的操作
1.连接数组
1.concatenate函数:沿指定轴连接多个数组
[1,2,3] [1,2,3]
[4,5,6]+[10,11,12]———————— [4,5,6]
[7,8,9] [7,8,9]
[10,11,12]
[1,2,3] [10 [1,2,3,10]
[4,5,6]+ 11———————— [4,5,6,11]
[7,8,9] 12] [7,8,9,12]
向下直接拼接
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=np.array([[10,11,12]])
ab=np.concatenate((a,b))
print(ab)
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
向右拼接(将原来一维数组转置后拼接)
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=np.array([[10,11,12]]).T//转置
ab=np.concatenate((a,b),axis=1)
print(ab)
[[ 1 2 3 10]
[ 4 5 6 11]
[ 7 8 9 12]]
2.hstack函数
hstack函数沿水平堆叠多个数组,相当于concatenate函数在axis=1的情况
import numpy as np
a=np.array([[1,2],[3,4]])
print(a)
b=np.array([[5,6]]).T
c=np.concatenate([a,b],axis=1)
print(c)
d=np.hstack([a,b])
print(d)
[[1 2]
[3 4]]
[[1 2 5]
[3 4 6]]
[[1 2 5]
[3 4 6]]
3.vstack函数
vstack函数言垂直堆叠多个数组,相当于concatenate函数在axis=0的情况。
import numpy as np
a=np.array([[1,2],[3,4]])
print(a)
b=np.array([[5,6]])
c=np.concatenate([a,b],axis=0)
print(c)
d=np.vstack([a,b])
print(d)
[[1 2]
[3 4]]
[[1 2]
[3 4]
[5 6]]
[[1 2]
[3 4]
[5 6]]
2.splik——切割数组
①语法:np.splik(ary,indices_or_sections,axis)
属性 | 标注 |
---|---|
ary | 指定所属数组 |
indices_or_sections | 对应的数组或者整数,如果整数就用该数平均分割数组,如果数组就按照指定轴做切片处理 |
axis | 轴的分割方向 |
②基本操作
A.平均等分数组:
等分一维数组:
import numpy as np
a=np.array([1,2,3,4,5,6,7,8,9])
print(np.split(a,3))
[array([1, 2, 3]), array([4, 5, 6]), array([7, 8, 9])]
按列等分二维数组
1.修改axis参数
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=np.split(a,3,axis=1)
print(b)
[array([[1],
[4],
[7]]), array([[2],
[5],
[8]]), array([[3],
[6],
[9]])]
2.使用hsplit()
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=np.hsplit(a,3)
print(b)
[array([[1],
[4],
[7]]), array([[2],
[5],
[8]]), array([[3],
[6],
[9]])]
按行等分二维数组
1.修改axis参数
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=np.split(a,3,axis=0)
print(b)
[array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]
2.使用vsplit()
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=np.vsplit(a,3)
print(b)
[array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]
B.用一个数组分割整体数组
import numpy as np
a=np.array([1,2,3,4,5,6,7,8,9])
b=np.split(a,[4,6])
print(b)
[array([1, 2, 3, 4]), array([5, 6]), array([7, 8, 9])]
五、数组的算术运算
1.numpy数组可以使用python里面的加减乘除乘方进行数组内部元素的算术运算。
2.数组的加法运算
①实例
a=[1,2,3,4] b=[2,3,4,5] a+b=[3,5,7,9]
a=[1,2] b=[2,3] a+b=[3,5]
[3,4] [4,5] [7,9]
②代码操作
一维数组的加法运算
import numpy as np
a=np.array([1,2,3,4,5])
b=np.array([2,4,6,8,10])
print(a+b)
[ 3 6 9 12 15]
二维数组的加法运算
import numpy as np
a=np.array([[1,2,3],[6,7,8]])
b=np.random.rand(2,3)
print('b的数组为:',b)
print(a+b)
b的数组为: [[0.39952873 0.62792605 0.63734903]
[0.80093729 0.51350318 0.33915585]]
[[1.39952873 2.62792605 3.63734903]
[6.80093729 7.51350318 8.33915585]]
数组内每个元素加固定值
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=a+10
print(b)
[[11 12 13]
[14 15 16]
[17 18 19]]
3.数组里面减法运算(同加法)
4.数组里面的乘法运算
①实例
a=[1,2,3] b=[1,3,5] a*b=[1,6,15]
[4,5,6] [2,4,6] [8,20,36]
[7,8,9] [3,4,5] [21,32,45]
②代码操作
一维数组的乘法运算
import numpy as np
a=np.array([1,2,3,4])
b=np.array([2,3,4,5])
print(a*b)
[ 2 6 12 20]
每个元素同乘一个数
import numpy as np
a=np.array([1,2,3,4])
b=np.array([2,3,4,5])
print(a*3)
print(b*5)
[ 3 6 9 12]
[10 15 20 25]
二维数组乘法运算
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=np.array([[1,2,3],[2,4,6],[3,6,9]])
print(a*b)
[[ 1 4 9]
[ 8 20 36]
[21 48 81]]
5.数组里面的除法运算(同乘法)
6.矩阵里面的幂运算
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a**2)
[[ 1 4 9]
[16 25 36]
[49 64 81]]
*这里面的加、减、乘、除、乘方运算都为在数组里面元素的计算,乘除法不是矩阵相乘。
六、数组的广播
1.数组广播的概念:不同形状的数组或者标量计算时发生广播。
2.标量广播:一个数组与一个标量进行运算,这个标量会构成一个数组与原来数组的形状相同。
eg;
a=[1,2,3,4] a+10=[1,2,3,4]+[10,10,10,10]=[11,12,13,14]
a*10=[1,2,3,4]*[10,10,10,10]=[10,20,30,40]
eg:
a=[1,2] a+10= [1,2] + [10,10] = [11,12]
[3,4] [3,4] [10,10] [13,14]