当数组为0行时,我可以使numpy.sum返回0吗?

时间:2018-06-13 14:51:29

标签: python numpy

我有一个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

这样可以正常工作,但在我的代码中需要数百个额外的行,感觉有点不必要,所以我只是想知道是否有人能更有效地解决这个问题。谢谢!

2 个答案:

答案 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