Numpy数组元素的存取:索引与切片

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

猜你喜欢

转载自blog.csdn.net/bqw18744018044/article/details/79929896