天天看点

python list[list] or list[list, list, list]

list[list]

看代码应该就可以理解是什么意思了

用法总结附在结尾

a = np.array([i for i in range(30)]).reshape((2, 3, 5))
print(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]]]
           
b = np.array([1, 0, 1, 0])
print(a[b])

[[[15 16 17 18 19]
  [20 21 22 23 24]
  [25 26 27 28 29]]

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

 [[ 0  1  2  3  4]
  [ 5  6  7  8  9]
  [10 11 12 13 14]]]

print(a[b].shape)
(1, 3, 5)
           
b = np.array([[1, 0], [0, 1]])
print(a[b])

[[[[15 16 17 18 19]
   [20 21 22 23 24]
   [25 26 27 28 29]]

  [[ 0  1  2  3  4]
   [ 5  6  7  8  9]
   [10 11 12 13 14]]]


 [[[ 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]]]]
   
print(a[b].shape)
(2, 2, 3, 5)
           
b = np.array([[[1, 0],
               [0, 1]],

              [[1, 0],
               [0, 1]]]).reshape([2, 4, 1])
print(a[b])

[[[[[15 16 17 18 19]
    [20 21 22 23 24]
    [25 26 27 28 29]]]


  [[[ 0  1  2  3  4]
    [ 5  6  7  8  9]
    [10 11 12 13 14]]]


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



 [[[[15 16 17 18 19]
    [20 21 22 23 24]
    [25 26 27 28 29]]]


  [[[ 0  1  2  3  4]
    [ 5  6  7  8  9]
    [10 11 12 13 14]]]


  [[[ 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]]]]]
    
print(b.shape)
(2, 4, 1)

print(a[b].shape)
(2, 4, 1, 3, 5)
           

总结:

a[b] 表示 b 对 a 的 0 维进行选择操作

b 的维度任意 但 b中的 value 要小于a.shape[0]

假设 a.shape=(A, B, C, D) b.shape=(E, F, G, H)

则a[b].shape=(E, F, G, H, B, C, D)

list[list, list, list]

先讲代码,后贴总结

a = np.array([i for i in range(48)]).reshape((4, 2, 2, 3))
print('a:\n', a, '\n')

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]]]] 
           
cam_idx = np.random.randint(0, 4, (4, 1, 1))
print('cam_idx:\n', cam_idx, '\n')

cam_idx:
 [[[0]]

 [[3]]

 [[1]]

 [[1]]] 
           
pix_x_int = np.random.randint(0, 2, (4, 2, 2))
print('pix_x_int:\n', pix_x_int, '\n')

pix_x_int:
 [[[1 1]
  [0 0]]

 [[0 0]
  [0 1]]

 [[0 1]
  [0 1]]

 [[1 1]
  [1 1]]] 
           
pix_y_int = np.random.randint(0, 2, (4, 2, 2))
print('pix_y_int:\n', pix_y_int, '\n')

pix_y_int:
[[[0 0]
[1 1]]

[[0 0]
[0 0]]

[[1 1]
[0 1]]

[[1 1]
[0 0]]] 
           
print('change_a:\n', a[cam_idx, pix_x_int, pix_y_int])

change_a:
 [[[[ 6  7  8]
   [ 6  7  8]]

  [[ 3  4  5]
   [ 3  4  5]]]


 [[[36 37 38]
   [36 37 38]]

  [[36 37 38]
   [42 43 44]]]


 [[[15 16 17]
   [21 22 23]]

  [[12 13 14]
   [21 22 23]]]


 [[[21 22 23]
   [21 22 23]]

  [[18 19 20]
   [18 19 20]]]]
           

cam_idx对a的第0维进行操作

pix_x_int对a的第1维进行操作

pix_y_int对a的第2维进行操作

拿change_a[0,…]举例

change_a[0,...]:

[[[ 6  7  8]
 [ 6  7  8]]

 [[ 3  4  5]
  [ 3  4  5]]]

cam_idx[:, 0, 0]:

[[0]]

pix_x_int[0, ...]:

[[1 1]
 [0 0]]

pix_y_int[0, ...]:

[[0 0]
 [1 1]]
           

cam_idx[:, 0, 0]的结果为[[0]],所以选择a的第0维数据

a[0,...]:

[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]]
           

将pix_x_int[0, …]和pix_y_int[0, …]的结果进行合并:

[(1,0)  (1,0)
 (0,1)  (0,1)]
           

分别表示:

取a[0, …]的a[0, 1, 0, …]

[ 6  7  8]
           

取a[0, …]的a[0, 1, 0, …]

[ 6  7  8]
           

取a[0, …]的a[0, 0, 1, …]

[ 3  4  5]
           

取a[0, …]的a[0, 0, 1, …]

[ 3  4  5]
           

将结果合并得到change_a[0, …]:

[[ 6  7  8]
 [ 6  7  8]]

 [[ 3  4  5]
  [ 3  4  5]]
           

总结:

list[list0, list1, list2]

list0对list的0维进行截取

list1对list的1维进行截取

list2对list的2维进行截取

list0,list1,list2的维度要与list截取的对应维度相符,其中的value分别不能大于list.shap[0], list.shape[1], list.shape[2]