我想创建一个自定义函数,它可以返回数组中所有元素的总和,无论是一维、二维还是三维。
这是我提出的,它运行,但总和是不正确的,我不知道它从哪里得到的数字。
array_1d = np.array([1,2,3,4,5])
array_2d = np.array([[1,3,4,5],[1,4,5,7]])
array_3d = np.array([[[1,3,4,5],[1,4,5,7]],[[6,7,8,9],[7,8,7,6]]])
def sum(array):
sum = 0
shape = np.shape(array)
if len(np.shape(array)) == 3:
for i in range(0,shape[2]):
sum += array[0,1,2]
elif len(np.shape(array)) == 2:
for i in range(0,shape[1]):
sum += array[0,1]
elif len(np.shape(array)) == 1:
for i in range(0,shape[0]):
sum += array[0]
return sum
array_1d sum should be 15 but it gives me 5
array_2d sum should be 30 but i get 12
array_3d sum should be 88 but i get 20
我在工作中做错了什么?
(ps我知道我可以只使用np.sum,但它是用于赋值的)
4条答案
按热度按时间zqdjd7g91#
问题在于,您没有对所有值进行循环。您只能对一个特定值求和,次数与维组合(
5*1
、3*4
、5*4
)的次数相同。您需要嵌套循环(一维1个循环,二维2个循环,三维3个循环,等等)。使用递归函数一次对一个维度求和怎么样?
px9o7tmv2#
你可以简单地对数组进行flatten运算,然后对得到的一维数组求和:
(Note我将您的函数重命名为
array_sum
以避免隐藏内置的sum
函数)sum
代替for
循环来对数组求和,但我怀疑这会破坏赋值的目的arr.flatten()
,但我将其转换为列表并迭代列表,因为迭代列表比迭代数组快。xytpbqjk3#
当前代码的问题在于迭代,但从未使用
i
。要执行所需操作,可以直接使用
sum
方法:如果您希望根据数组的维度支持不同的轴求和,例如为1D输入返回数字,但为2D/3D输入返回按列或按行求和,则只需要定制函数。
另外,如果需要处理数组的维数,请使用
array.ndim
而不是len(array.shape)
。83qze16e4#
正如其他人已经指出的,您从来没有在代码中使用
i
。如果你想用
shape
迭代每个值,你可以使用下面的代码:请记住,对于大型阵列,此解决方案将非常缓慢。