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]