numpy对array索引

numpy中array索引

对numpy的array索引时总是容易出错,借此机会总结一下numpy中array最常用的索引方法

1.单个元素的索引

In [1]:
#1.1.一维array,单个元素的索引使用整数
import numpy as np
a = np.array([3, 5, 1, 2, 7, 9])
print('a:', a)
b = a[1]  
print('b:', b)

b = 77
print('a:', a)#改变b的值不会影响a的值
a: [3 5 1 2 7 9]
b: 5
a: [3 5 1 2 7 9]
In [2]:
# 1.2.多维array,单个元素的索引使用整数序列

#1.2.1 二维array
a = np.arange(12).reshape((3, 4))
print('a:\n', a)
b = a[1, 2]   #注意b = a[1, 2]等价于b = a[1][2], 索引a中第2行第3列的值, 实际上a[1][2]是先索引第一个维度得到一个array,在此基础上再索引
print('b:\n', b)
b = 77
print('a:\n', a)  #改变b的值不会影响a
a:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
b:
 6
a:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
In [3]:
#1.2.2 多维array
a = np.arange(96).reshape((2,3,4,4))
print('a:\n', a)
b = a[1, 2, 2, 2]   #注意b = a[1, 2, 2, 2]等价于b = a[1][2][2][2], 按每个维度一次索引,可以把a看做两张4*4的RGB图片,
                                                                                      # 则索引的是第2张图的第三个通道的第3行第3列
print('b:\n', b)
b = 9999
print('a:\n', a)  #改变b的值不会影响a
a:
 [[[[ 0  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 26 27]
   [28 29 30 31]]

  [[32 33 34 35]
   [36 37 38 39]
   [40 41 42 43]
   [44 45 46 47]]]


 [[[48 49 50 51]
   [52 53 54 55]
   [56 57 58 59]
   [60 61 62 63]]

  [[64 65 66 67]
   [68 69 70 71]
   [72 73 74 75]
   [76 77 78 79]]

  [[80 81 82 83]
   [84 85 86 87]
   [88 89 90 91]
   [92 93 94 95]]]]
b:
 90
a:
 [[[[ 0  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 26 27]
   [28 29 30 31]]

  [[32 33 34 35]
   [36 37 38 39]
   [40 41 42 43]
   [44 45 46 47]]]


 [[[48 49 50 51]
   [52 53 54 55]
   [56 57 58 59]
   [60 61 62 63]]

  [[64 65 66 67]
   [68 69 70 71]
   [72 73 74 75]
   [76 77 78 79]]

  [[80 81 82 83]
   [84 85 86 87]
   [88 89 90 91]
   [92 93 94 95]]]]

2.多个元素的索引

In [4]:
#2.1用少于array的维度的个数索引值去索引该array
a = np.arange(12).reshape((3, 4))
print('a:\n', a)
b = a[2]    #a的维度为2,但是只用一个索引值去索引第一个维度,得到b为一个array,shape由未被索引的维度组成
print('b:\n', b)

print('改变b中的值,会影响a')
b[1] = 77 
print('a:\n', a)  #改变b中的值,会影响a

print('给b整体赋值并不会影响a')
b = np.array([11, 11, 11, 11])
print('a:\n', a)  #给b整体赋值并不会影响a

print('改变a中对应的值, 会影响b')
a[2, 3] = 88
print('b:\n', b) #改变a中对应的值, 会影响b
a:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
b:
 [ 8  9 10 11]
改变b中的值,会影响a
a:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8 77 10 11]]
给b整体赋值并不会影响a
a:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8 77 10 11]]
改变a中对应的值, 会影响b
b:
 [11 11 11 11]
In [5]:
#应用:用少于array的维度的个数索引值去索引该array
#假设a为一个4维array,表示N个图像,(N,C,H,W),则从中取一张图像就可以直接这样索引:a[i]
a = np.arange(96).reshape((2, 4, 4, 3))
print(a[1])
print(a[1].shape)  #shape由未被索引的维度组成
[[[48 49 50]
  [51 52 53]
  [54 55 56]
  [57 58 59]]

 [[60 61 62]
  [63 64 65]
  [66 67 68]
  [69 70 71]]

 [[72 73 74]
  [75 76 77]
  [78 79 80]
  [81 82 83]]

 [[84 85 86]
  [87 88 89]
  [90 91 92]
  [93 94 95]]]
(4, 4, 3)
In [6]:
#2.2切片索引
a = np.arange(12).reshape((3, 4))
print('a:\n', a)
b = a[1:3, 2:4] #对每个维度依次切片,注意a[1:3][2:4]并不等价于a[1:3, 2:4], a[1:3][2:4]是先对a在第一个维度上切片后再切片
print('b:\n', b)

b[0][0] = 88
print('a:\n', a) #改变a的值会影响b
a:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
b:
 [[ 6  7]
 [10 11]]
a:
 [[ 0  1  2  3]
 [ 4  5 88  7]
 [ 8  9 10 11]]

总结:用小于array维度的个数的索引值索引和切片索引创建的新的array都为原array的第一视图,改变新array中的值(不是对新的array整体赋值)会影响原array的值;改变原array对应的值也会影响新array的值

3.用array索引array

In [7]:
#3.1一维array索引一维array
a = np.array([1, 7, 8, 9, 11, 3])
print('a:\n', a)
b = a[np.array([1, 2, 4])]  #用被索引的array的值替换索引array([1, 2, 4])
print('b:\n', b)

b[1] = 333
print('a:\n', a) #用array索引array创建的新的array是原array的一个copy,所以改变新的array不会改变原的array,下面不再验证这一点
a:
 [ 1  7  8  9 11  3]
b:
 [ 7  8 11]
a:
 [ 1  7  8  9 11  3]
In [8]:
#3.2多维array索引一维array
a = np.array([1, 7, 8, 9, 11, 3])
print('a:\n', a)
b = a[np.array([[1, 2, 3], [4, 1, 2]])] #用被索引的array的值替换索引array([[1, 2, 3], [4, 1, 2]])
print('b:\n', b)
a:
 [ 1  7  8  9 11  3]
b:
 [[ 7  8  9]
 [11  7  8]]
In [9]:
#3.3索引多维array
a = np.arange(12).reshape((3, 4))
print('a:\n', a)
b = a[np.array([1, 2]), np.array([1, 2])] #索引出的是a[1][1], a[2][2]
print('b:\n', b)
a:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
b:
 [ 5 10]
In [10]:
a = np.arange(12).reshape((3, 4))
print('a:\n', a)
b = a[np.array([1, 2])] #索引出的是第2,3行
print('b:\n', b)
a:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
b:
 [[ 4  5  6  7]
 [ 8  9 10 11]]

4布尔值(mask)索引

In [11]:
a = np.arange(12).reshape((3, 4))
print('a:\n', a)
idx = a > 5
print('idx:\n', idx)
b = a[idx]
print('b:\n', b) #返回的值为一维array( The elements in the indexed array are always iterated and returned in row-major (C-style) order. )
b[1] = 77
print('a:\n', a) 
a:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
idx:
 [[False False False False]
 [False False  True  True]
 [ True  True  True  True]]
b:
 [ 6  7  8  9 10 11]
a:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
In [12]:
idx_slice = idx[:,1]
print('idx_slice:\n', idx_slice) #布尔索引值个数等于第一个维度
b = a[idx_slice]  #索引第三行
print('b:\n', b)
idx_slice:
 [False False  True]
b:
 [[ 8  9 10 11]]

总结:用array去索引和布尔值索引都为高级索引,由此创建的新array为原array的一个copy,改变新array的值不会对旧array的值产生影响

阅读更多
个人分类: python
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭