python Numpy 数组操作时报 “shape mismatch: indexing arrays could not be broadcast together with shapes” 错误——解决方法
原代码:
a = np.arange(90).reshape(9, 10)
"""
a:
array([[ 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]])
"""
row = [0, 2, 5, 6, 7, 8]
col = [1, 3, 5, 6, 7, 8, 9]
goal = a[row, col]
然后报错:IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (6,) (7,)
原因:索引必须是方阵,如果将上面的row和col改成一样的长度就不会报错
如果还是想得到a[row, col],则需要分两步走:
temp = a[row, :]
goal = temp[:, col]
那么对于更高维度的数组又该如何操作?
两步走的实质是先处理一个维度,再处理一个维度 -> 同理:
对于一个N维数组,每次只对一个维度进行选择的处理 -> N步走
以一个四维数组为例:
a = np.arange(4*5*7*3).reshape(4, 5, 7, 3)
# 各个维度的选择
p1 = [0, 2]
p2 = [0, 3, 4]
p3 = [1, 2, 5, 6]
p4 = [0, 1]
P = [p1, p2, p3, p4]
# N步走
temp = a
for i, p in enumerate(P):
s = 'temp['+ ':,'*i + str(p) + ',:'*(len(P)-i-1) + ']'
"""
s由三部分组成:
p为当前选择的维度 (第i维)
p之前用':' (共有i维)
p之后用':' (共有 len(P)-i-1 维)
"""
# print(s)
temp = eval(s)
'''循环结束后得到的temp即为P选出来的目标数组'''
实现关键:
enumerate()
eval()