numpy自定义函数,用于1d/2d/3d数组的求和

nkkqxpd9  于 2023-03-08  发布在  其他
关注(0)|答案(4)|浏览(209)

我想创建一个自定义函数,它可以返回数组中所有元素的总和,无论是一维、二维还是三维。
这是我提出的,它运行,但总和是不正确的,我不知道它从哪里得到的数字。

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,但它是用于赋值的)

zqdjd7g9

zqdjd7g91#

问题在于,您没有对所有值进行循环。您只能对一个特定值求和,次数与维组合(5*13*45*4)的次数相同。您需要嵌套循环(一维1个循环,二维2个循环,三维3个循环,等等)。
使用递归函数一次对一个维度求和怎么样?

def array_sum(array):
    def my_sum(a):
        S = 0
        for x in a:
            S += x
        return S
    if array.ndim == 1:
        return my_sum(array)
    return my_sum(array_sum(a) for a in array)

array_sum(array_1d)
# 15

array_sum(array_2d)
# 30

array_sum(array_3d)
# 88
px9o7tmv

px9o7tmv2#

你可以简单地对数组进行flatten运算,然后对得到的一维数组求和:
(Note我将您的函数重命名为array_sum以避免隐藏内置的sum函数)

def array_sum(arr):
    total = 0
    for num in arr.flatten().tolist():
        total += num

    return total
  • 您也可以使用内置的sum代替for循环来对数组求和,但我怀疑这会破坏赋值的目的
  • 我们可以迭代arr.flatten(),但我将其转换为列表并迭代列表,因为迭代列表比迭代数组快。
array_sum(array_1d) # 15
array_sum(array_2d) # 30
array_sum(array_3d) # 88
xytpbqjk

xytpbqjk3#

当前代码的问题在于迭代,但从未使用i
要执行所需操作,可以直接使用sum方法:

import numpy as np

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]]])

for array in (array_1d, array_2d, array_3d):
    print(sum_array(array))
# >>> 15
# >>> 30
# >>> 88

如果您希望根据数组的维度支持不同的轴求和,例如为1D输入返回数字,但为2D/3D输入返回按列或按行求和,则只需要定制函数。
另外,如果需要处理数组的维数,请使用array.ndim而不是len(array.shape)

83qze16e

83qze16e4#

正如其他人已经指出的,您从来没有在代码中使用i
如果你想用shape迭代每个值,你可以使用下面的代码:

def sum(array):

     sum = 0

     shape = np.shape(array)

     if len(np.shape(array)) == 3:
         for i in range(0,shape[0]):
             for j in range (0,shape[1]):
                 for k in range (0,shape[2]):
                     sum += array[i,j,k]
     elif len(np.shape(array)) == 2:
         for i in range(0,shape[0]):
             for j in range (0,shape[1]):
                sum+= array[i,j]
     elif len(np.shape(array)) == 1:
         for i in range(0,shape[0]):
             sum += array[i]
    
     return sum

请记住,对于大型阵列,此解决方案将非常缓慢。

相关问题