import numpy as np
一、基本索引
获取单个元素
a = np.diag(np.arange(3))
print(a[1,1])
1
获取一组元素
print(a[1])
[0 1 0]
修改元素
a[2,1] = 10
print(a)
[[ 0 0 0]
[ 0 1 0]
[ 0 10 2]]
二、花式索引
a = np.arange(10,1,-1)
a
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
1.使用整数列表存取元素
b = a[[3,3,-3,7]]
print(b)
[7 7 4 3]
使用整数列表获得的数组与原数组不共享内存
b[0]=100
print(b)
print(a)
[100 7 4 3]
[10 9 8 7 6 5 4 3 2]
2.使用整数数组存取元素
b = a[np.array([4,4,2,1])]
b
array([6, 6, 8, 9])
3.使用boolean数组存取元素
mask = [a%3 == 0]
print(mask)
a[mask]
[array([False, True, False, False, True, False, False, True, False], dtype=bool)]
array([9, 6, 3])
三、切片
a = np.arange(10)
print(a)
[0 1 2 3 4 5 6 7 8 9]
取[3,5)中的元素
a[3:5]
array([3, 4])
取[0,5)中的元素
a[:5]
array([0, 1, 2, 3, 4])
取第2到倒数第2的所有元素
a[2:-2]
array([2, 3, 4, 5, 6, 7])
由第2个元素到倒数第2个元素,步长为2的所有元素
a[2:-2:2]
array([2, 4, 6])
由倒数第2个元素到第2个元素,步长为-2的所有元素
a[-2:2:-2]
array([8, 6, 4])
倒置数组
a[::-1]
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
四、复制与视图
1.视图:通过切片获得的数组是原数组的视图,与原数组共享内存
a = np.arange(10)
b = a[::2]
np.may_share_memory(a,b)
True
两数组共享内存,修改其中的一个数组,另一个同时会被修改
b[0] = 999
print(b)
print(a)
[999 2 4 6 8]
[999 1 2 3 4 5 6 7 8 9]
2.复制:使用copy函数
c = a[::2].copy()
c[0] = -999
print(c)
print(a)
[-999 2 4 6 8]
[999 1 2 3 4 5 6 7 8 9]
五、多维数组上的索引
1.通过广播创建二维数组
a = np.arange(0,60,10).reshape(-1,1) # 一个6*1的二维数组
b = np.arange(0,6) # 一个6个元素的一维数组
print(a)
print(b)
[[ 0]
[10]
[20]
[30]
[40]
[50]]
[0 1 2 3 4 5]
广播的示例:将a[0]依次加到b中的元素上
print(a[0])
print(b)
a[0]+b
[0]
[0 1 2 3 4 5]
array([0, 1, 2, 3, 4, 5])
利用广播创建二维数组
c = a+b
print(c)
[[ 0 1 2 3 4 5]
[10 11 12 13 14 15]
[20 21 22 23 24 25]
[30 31 32 33 34 35]
[40 41 42 43 44 45]
[50 51 52 53 54 55]]
2.将一维数组转换为二维数组(将n维转变m维,m>n)
print(b[None,:]) #1*6的二维数组
print(b[:,None]) #6*1的二维数组
[[0 1 2 3 4 5]]
[[0]
[1]
[2]
[3]
[4]
[5]]
3.使用元组存取多维数组
c[(0,1,2,4,4),(1,2,1,3,4)] #取(0,1)、(1,2)、(2,1)、(4,3)、(4,4)
array([ 1, 12, 21, 43, 44])
4.使用切片存取多维数组
print(c[0,3:5]) # 第0行的第3、4个元素,及c[0,3]、c[0,4]
print(c[4:,4:]) # 第4行到最后行与第4列到最后列交叉的所有元素
print(c[:,2]) # 第2列的所有元素
[3 4]
[[44 45]
[54 55]]
[ 2 12 22 32 42 52]
六、通过索引获取元素并重塑其形状
1.索引的形状决定了通过索引获得的数组的形状
a = np.arange(10)
print(a)
idx = np.array([[3,4],[9,7]])
print(idx.shape) #索引的形状
a[idx] # 将数组a中的a[3]、a[4]、a[9]、a[7]按指定的形状重新组合
[0 1 2 3 4 5 6 7 8 9]
(2, 2)
array([[3, 4],
[9, 7]])
2.将所有轴重塑为同一形状,获取的元素组成的数组也是相同的形状
x = np.array([[0,0],
[3,3]])
y = np.array([[1,2],
[4,2]])
c[x,y] #将c[0,1]、c[0,2]、c[3,4]、c[3,2]组织成2*2的二维数组
array([[ 1, 2],
[34, 32]])