通过索引的二维数组更改二维数组
Change 2D array by 2D array of indices
我有输入数组:
np.random.seed(45)
a = np.random.randint(100,size=(5,21))
print (a)
[[75 30 3 32 95 61 85 35 68 15 65 14 53 57 72 87 46 8 53 12 34]
[24 12 17 68 30 56 14 36 31 86 36 57 61 79 17 6 42 11 8 49 77]
[75 63 42 54 16 24 95 63 98 22 27 32 16 75 58 60 54 96 70 32 16]
[59 92 55 88 5 81 93 79 67 55 60 57 83 27 78 18 87 55 20 9 9]
[73 27 57 50 7 57 78 68 23 75 41 39 70 2 71 70 27 47 54 93 19]]
索引数组:
b = np.array(
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0],
[20, 19, 18, 17, 16, 15, 14, 13, 12, 11]]
)
print (b)
[[ 0 1 2 3 4 5 6 7 8 9]
[ 9 8 7 6 5 4 3 2 1 0]
[20 19 18 17 16 15 14 13 12 11]]
预期输出:
c = np.array(
[[75, 30, 3, 32, 95, 61, 85, 35, 68, 15],
[24, 12, 17, 68, 30, 56, 14, 36, 31, 86],
[75, 63, 42, 54, 16, 24, 95, 63, 98, 22],
[59, 92, 55, 88, 5, 81, 93, 79, 67, 55],
[73, 27, 57, 50, 7, 57, 78, 68, 23, 75],
[15, 68, 35, 85, 61, 95, 32, 3, 30, 75],
[86, 31, 36, 14, 56, 30, 68, 17, 12, 24],
[22, 98, 63, 95, 24, 16, 54, 42, 63, 75],
[55, 67, 79, 93, 81, 5, 88, 55, 92, 59],
[75, 23, 68, 78, 57, 7, 50, 57, 27, 73],
[34, 12, 53, 8, 46, 87, 72, 57, 53, 14],
[77, 49, 8, 11, 42, 6, 17, 79, 61, 57],
[16, 32, 70, 96, 54, 60, 58, 75, 16, 32],
[9, 9, 20, 55, 87, 18, 78, 27, 83, 57],
[19, 93, 54, 47, 27, 70, 71, 2, 70, 39]]
)
print (c)
#indices - [ 0 1 2 3 4 5 6 7 8 9]
#array is not changed
[[75 30 3 32 95 61 85 35 68 15]
[24 12 17 68 30 56 14 36 31 86]
[75 63 42 54 16 24 95 63 98 22]
[59 92 55 88 5 81 93 79 67 55]
[73 27 57 50 7 57 78 68 23 75]
#indices - [ 9 8 7 6 5 4 3 2 1 0]
#array is changed first column is a[:, 9], second a[:, 8], ...
[15 68 35 85 61 95 32 3 30 75]
[86 31 36 14 56 30 68 17 12 24]
[22 98 63 95 24 16 54 42 63 75]
[55 67 79 93 81 5 88 55 92 59]
[75 23 68 78 57 7 50 57 27 73]
#indices - [20 19 18 17 16 15 14 13 12 11]
#array is changed first column is a[:, 20], second a[:, 19], ...
[34 12 53 8 46 87 72 57 53 14]
[77 49 8 11 42 6 17 79 61 57]
[16 32 70 96 54 60 58 75 16 32]
[ 9 9 20 55 87 18 78 27 83 57]
[19 93 54 47 27 70 71 2 70 39]]
解释:
对于索引数组的每一行,需要更改输入数组的列,最后将所有数组连接在一起。
我相信有一些不错的矢量化解决方案。
我的尝试:
我检查了this,但没有帮助。
索引到列、排列轴和重塑形状 -
c = a[:, b].swapaxes(0,1).reshape(-1,b.shape[1])
我有输入数组:
np.random.seed(45)
a = np.random.randint(100,size=(5,21))
print (a)
[[75 30 3 32 95 61 85 35 68 15 65 14 53 57 72 87 46 8 53 12 34]
[24 12 17 68 30 56 14 36 31 86 36 57 61 79 17 6 42 11 8 49 77]
[75 63 42 54 16 24 95 63 98 22 27 32 16 75 58 60 54 96 70 32 16]
[59 92 55 88 5 81 93 79 67 55 60 57 83 27 78 18 87 55 20 9 9]
[73 27 57 50 7 57 78 68 23 75 41 39 70 2 71 70 27 47 54 93 19]]
索引数组:
b = np.array(
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0],
[20, 19, 18, 17, 16, 15, 14, 13, 12, 11]]
)
print (b)
[[ 0 1 2 3 4 5 6 7 8 9]
[ 9 8 7 6 5 4 3 2 1 0]
[20 19 18 17 16 15 14 13 12 11]]
预期输出:
c = np.array(
[[75, 30, 3, 32, 95, 61, 85, 35, 68, 15],
[24, 12, 17, 68, 30, 56, 14, 36, 31, 86],
[75, 63, 42, 54, 16, 24, 95, 63, 98, 22],
[59, 92, 55, 88, 5, 81, 93, 79, 67, 55],
[73, 27, 57, 50, 7, 57, 78, 68, 23, 75],
[15, 68, 35, 85, 61, 95, 32, 3, 30, 75],
[86, 31, 36, 14, 56, 30, 68, 17, 12, 24],
[22, 98, 63, 95, 24, 16, 54, 42, 63, 75],
[55, 67, 79, 93, 81, 5, 88, 55, 92, 59],
[75, 23, 68, 78, 57, 7, 50, 57, 27, 73],
[34, 12, 53, 8, 46, 87, 72, 57, 53, 14],
[77, 49, 8, 11, 42, 6, 17, 79, 61, 57],
[16, 32, 70, 96, 54, 60, 58, 75, 16, 32],
[9, 9, 20, 55, 87, 18, 78, 27, 83, 57],
[19, 93, 54, 47, 27, 70, 71, 2, 70, 39]]
)
print (c)
#indices - [ 0 1 2 3 4 5 6 7 8 9]
#array is not changed
[[75 30 3 32 95 61 85 35 68 15]
[24 12 17 68 30 56 14 36 31 86]
[75 63 42 54 16 24 95 63 98 22]
[59 92 55 88 5 81 93 79 67 55]
[73 27 57 50 7 57 78 68 23 75]
#indices - [ 9 8 7 6 5 4 3 2 1 0]
#array is changed first column is a[:, 9], second a[:, 8], ...
[15 68 35 85 61 95 32 3 30 75]
[86 31 36 14 56 30 68 17 12 24]
[22 98 63 95 24 16 54 42 63 75]
[55 67 79 93 81 5 88 55 92 59]
[75 23 68 78 57 7 50 57 27 73]
#indices - [20 19 18 17 16 15 14 13 12 11]
#array is changed first column is a[:, 20], second a[:, 19], ...
[34 12 53 8 46 87 72 57 53 14]
[77 49 8 11 42 6 17 79 61 57]
[16 32 70 96 54 60 58 75 16 32]
[ 9 9 20 55 87 18 78 27 83 57]
[19 93 54 47 27 70 71 2 70 39]]
解释:
对于索引数组的每一行,需要更改输入数组的列,最后将所有数组连接在一起。
我相信有一些不错的矢量化解决方案。
我的尝试:
我检查了this,但没有帮助。
索引到列、排列轴和重塑形状 -
c = a[:, b].swapaxes(0,1).reshape(-1,b.shape[1])