学习时间:9:00——11:30 15:00——16:40
1. 切片和索引
—ndarray对象的内容可以通过索引或切片来访问和修改,与python中的list切片操作一样
—ndarray数组可以基于0—n的下标进行索引(索引+1 = 数的第几位)
2. 一维数组
冒号分隔切片参数:[start:stop:step]
冒号的解释:
—如果只放一个参数如[2]表示返回对应的单个元素
—如果为[2:]表示从该索引开始所有项均被提取
—如果为[:7]表示从起始项开始到该索引项均被提取
—如果使用两个参数如[2:7]那么提取两个索引之间的项但不包括停止索引(左闭右开)
—如果想将所有项取反,则将步长设为-1,及[ : : -1 ]
为什么切片和区间会忽略最后一个元素呢?
—当只有停止索引(第二个参数)时,我们可以快速看出切片中有几个元素
import numpy as np
a = np.array([1,3,5,7,9,11,13,15,17,19])
print(a[:4])
#[1 3 5 7] #输出4个元素
—当起始索引和停止索引均可见时,可以快速计算出切片或区间的长度(stop-start即可)
import numpy as np
a = np.array([1,3,5,7,9,11,13,15,17,19])
print(a[1:4])
#[3 5 7] #4-1=3,切片长度为3
—当我们想把一个序列分割成互不重复的两部分时,只要写成list [ : x ] 和 list [ x : ] 即可
import numpy as np
a = np.array([1,3,5,7,9,11,13,15,17,19])
print('a[:2]:',a[:2])
print('a[2:]:',a[2:])
#a[:2]: [1 3]
#a[2:]: [ 5 7 9 11 13 15 17 19]
多维数组
—每次索引切片得到下一维度的一个元素,如二维数组切片一次得到一维数组,以此类推
—切片还可以用省略号“...”,如果在行位置使用,那么返回值包括所有行元素,反之,包含所有列元素
import numpy as np
a = np.array([
[0,1,2,3,4],
[5,6,7,8,9],
[10,11,12,13,14],
[15,16,17,18,19]
])
print(a)
print(a[...,1]) #表示取第二列元素
print(a[...,1:]) #表示取除了第一列外的所有列元素
print(a[...][1]) #第一个省略号表示取所有行,也就是a本身,然后取的二行所有元素
#[[ 0 1 2 3 4]
# [ 5 6 7 8 9]
# [10 11 12 13 14]
# [15 16 17 18 19]]
#[ 1 6 11 16]
#[[ 1 2 3 4]
# [ 6 7 8 9]
# [11 12 13 14]
# [16 17 18 19]]
#[5 6 7 8 9]
索引高级操作1——整数数组索引
x = np.array([
[1,2],
[3,4],
[5,6]
])
y = x[[0,1,2],[0,1,0]] #[0,1,2]代表行索引,[0,1,0]代表列索引
print(y) #y分别取x中的(0,0)(1,1)(2,0)的数据,可以把二维数组当做坐标轴
#[1 4 5]
创建一个五子棋棋盘矩阵(黑块为0,白块为1)
z = np.zeros((8,8),dtype = int)
z[1::2,::2] = 1
z[::2,1::2] = 1
print(z)
#[[0 1 0 1 0 1 0 1]
# [1 0 1 0 1 0 1 0]
# [0 1 0 1 0 1 0 1]
# [1 0 1 0 1 0 1 0]
# [0 1 0 1 0 1 0 1]
# [1 0 1 0 1 0 1 0]
# [0 1 0 1 0 1 0 1]
# [1 0 1 0 1 0 1 0]]
索引高级操作2——布尔数组索引
当输出结果需要进行布尔运算(比如比较运算)时,会用到布尔数组索引
a = np.array([
[0,1,2,3,4],
[5,6,7,8,9],
[10,11,12,13,14],
[15,16,17,18,19]
])
print(a[a>10]) #输出大于10的所有元素
#[11 12 13 14 15 16 17 18 19]
a = np.array([
[0,1,2,3,4],
[5,6,7,8,9],
[10,11,12,13,14],
[15,16,17,18,19]
])
print(a[a%2 == 1]) #提取数组中所有的奇数
a[a%2 == 1]=-1 #将奇数值修改为-1
print(a)
#[ 1 3 5 7 9 11 13 15 17 19]
#[[ 0 -1 2 -1 4]
# [-1 6 -1 8 -1]
# [10 -1 12 -1 14]
# [-1 16 -1 18 -1]]
—多个条件:&和 | 或
—True和False表示需要或不需要的数据
a = np.arange(12).reshape((3,4))
row = np.array([False,True,True])
colum = np.array([True,False,True,False])
print(a)
print(a[row]) #表示取第二行和第三行所有元素
print(a[:,colum]) #表示取第一列和第三列所有元素
#[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
#[[ 4 5 6 7]
# [ 8 9 10 11]]
#[[ 0 2]
# [ 4 6]
# [ 8 10]]
广播机制
如果两个数组的形状相同,那么相乘的结果是对应位相乘,这要求维数相同,各维的长度相同
广播是numpy对不同形状的数组进行数值计算的方式,对形状较小的数组在横向或纵向上进行一定次数的重复,使其与形状较大的数组具有相同的维度
—规则:将两个数组的维度大小右对齐,然后比较对于维度上的数值;如果数值相等或其中一个为1或为空,则能进行广播运算;输出的维度大小为较大的数值,否则不能进行数组运算