我有一个sum函数,在简化版本中,它看起来像这样:用作指示符的行数组在我的程序中动态变化,但这是一个大大减少的版本来演示这个问题:
如果我向Row1数组抛出一些整数,这显然很好,这显然是有意的,但是因为有些实例,其中一个行数组在我的程序中是空的,我在考虑是否可以使numpy执行此任务而不会抛出错误。我们
arr = np.array([1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1])
Row1 = np.array([])
Row2 = np.array([1,2])
Col = np.array([0,2])
Result = np.sum(arr[Row1[:, None], Col]) + np.sum(arr[Row2[:, None], Col]
这显然可以解释为返回4(0 + 4)但是numpy显然会抛出一个错误,因为我试图指出一个0维数组。我可以通过这样做来解决这个问题:
arr = np.array([1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1])
Row1 = np.array([])
Row2 = np.array([1,2])
Col = np.array([0,2])
sum1 = np.sum(arr[Row1[:, None], Col]) if len(Row1) > 0 else 0
sum2 = np.sum(arr[Row2[:, None], Col]) if len(Row2) > 0 else 0
Result = sum1 + sum2
这样可以正常工作,但在我的代码中需要数百个额外的行,感觉有点不必要,所以我只是想知道是否有人能更有效地解决这个问题。谢谢!
答案 0 :(得分:1)
我定义了你自己的sum
func来包装这个逻辑,那么你就不需要修改那么多行:
In [235]:
def mySum(a, row, col):
if len (row) > 0:
return np.sum(a[row[:, None], col])
else:
return 0
Result = mySum(arr,Row1, Col) + mySum(arr,Row2,Col)
Result
Out[235]: 4
这里要考虑的是我是否需要多次编写相同的代码,将其转换为函数
答案 1 :(得分:1)
“这显然可以解释为返回4(0 + 4)但是numpy显然会抛出一个错误,因为我试图指示一个0维数组。我可以通过这样做来解决这个问题: “
不,只要你确保空数组有dtype int
它就可以了。
arr = np.array(([1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]))
Row1 = np.array([], dtype=int)
Row2 = np.array([1,2])
Col = np.array([0,2])
Result = np.sum(arr[Row1[:, None], Col]) + np.sum(arr[Row2[:, None], Col])
Result
# 4