首页 > 解决方案 > 嵌套数组的递归元素加法以获得标量值

问题描述

我想编写一个接收数组的函数,检查接收到的数组是否是嵌套数组(可以深度嵌套)并对嵌套数组中的元素求和,然后在结果数组中添加元素,直到我得到一个标量值

data_array 
[[[9.2e-05 9.4e-05 9.3e-05]
  [9.3e-05 9.9e-05 9.6e-05]
  [9.3e-05 9.8e-05 9.2e-05]]

 [[9.03e-05 8.9e-05 9.03e-05]
  [8.43e-05 8.9e-05 9.01e-05]
  [7.95e-05 7.7e-05 7.21e-05]]]
Desired_output = [[9.27e-05 9.7e-05 9.36e-05] [8.43e-05 8.56e-05 8.4e-05]] -> [0.000094 0.000084] -> 0.000089

(首先元素先平均列,然后逐行添加,直到达到标量值)

1st example has 2 lists of two 2d (dim 3*3) arrays. I want to get average for each element column wise and and get 2 (1*3) arrays, then I get 1 (1*3) array which is average of two 2d (1*3) arrays. Finally with the last 1*3 array I want to sum all the elements and get the scalar value 

或者

data_array
[[[[8.4e-05 8.5e-05 9.5e-05]
   [8.7e-05 8.8e-05 8.8e-05]
   [7.6e-05 6.8e-05 6.3e-05]]

  [[8.8e-05 9.4e-05 8.8e-05]
   [8.4e-05 8.9e-05 9.3e-05]
   [8.1e-05 8.1e-05 7.7e-05]]]]
Desired_output = [[0.000083 8.03e-05 8.2e-05] [8.43e-05 8.8e-05 8.6e-05]] -> [8.17e-05 8.61e-05] -> 8.38e-05

(首先元素先平均列,然后逐行添加,直到达到标量值)

或者

data_array
[[[[4.77e-05]]]
 [[[3.75e-05]]]
 [[[2.95e-05]]]]

所需输出 -> 3.76e-05

我的原始尝试

import numpy as np    
def sumOfArray(array):
    sumTotal = []
    for element in array:
        if type(element) is list:
            sumTotal += np.sum(list, axis=1)
            sumTotal += sumOfArray(list)
        else:
            return array
    return [sum(elem) for elem in sumTotal]

标签: python

解决方案


递归的好应用!

请参阅以下代码以执行您想要的操作(如果数据错误,则引发异常)。numpy如果您想避免它,则不需要:

def nested_array_to_scalar(data):
    total = 0.0
    for datum in data:
        if isinstance(datum, (int, float)):
            total += datum
        elif isinstance(datum, (list, tuple)):                     
            total += nested_array_to_scalar(datum)
        else:
            raise TypeError("Data must be lists or numbers in all dimensions!")
    return total

编辑:您确实知道示例测试用例中的很多总和是错误的吗?

>>> 4.77e-5 + 3.75e-5 + 2.95e-5
0.0001147 # = 1.147e-4

编辑 2:如果您确实想使用numpy,请确保将numpy数据类型添加到isintanceargs。例如

isinstance(datum, (list, tuple))

isinstance(datum, (list, tuple, np.array))

推荐阅读