使用 numpy 在 Python 中进行嵌套数组计算

Nested array computations in Python using numpy

我正在尝试在 Python 中使用 numpy 来解决我的项目。

我有一个 random binary array rndm = [1, 0, 1, 1] 和一个 resource_arr = [[2, 3], 4, 2, [1, 2]]。我想做的是明智地乘以数组元素,然后得到它们的总和。作为上述示例的预期输出, output = 5 0 2 3。我发现很难解决这样的问题,因为 nested array/list.

到目前为止,我的代码如下所示:

   def fitness_score():

   output = numpy.add(rndm * resource_arr)
   return output


   fitness_score()

我不断收到

ValueError: invalid number of arguments. 

我认为这是因为我正在尝试添加。任何帮助,将不胜感激。谢谢!

我对 pandas/numpy 的工作不多,所以我不确定这是否是最有效的方法,但它确实有效(至少对于你展示的示例):

import numpy as np
rndm = [1, 0, 1, 1]
resource_arr = [[2, 3], 4, 2, [1, 2]]

multiplied_output = np.multiply(rndm, resource_arr)
print(multiplied_output)

output = []
for elem in multiplied_output:
  output.append(sum(elem)) if isinstance(elem, list) else output.append(elem)

final_output = np.array(output)
print(final_output)

Numpy 是关于非锯齿状数组的。您可以使用锯齿状数组来做事,但高效而优雅地做到这一点并非易事。

几乎总是,尝试找到一种方法将您的数据结构映射到非嵌套数据结构,例如,对信息进行如下编码,将更灵活,性能更高。

resource_arr = (
    [0, 0, 1, 2, 3, 3]
    [2, 3, 4, 2, 1, 2]
)

也就是说,一个整数表示 'row' 每个值所属的值,与值本身大小相等的数组配对。

这可能 'feel' 以 C 风格的方式处理数组时会造成浪费(我的天啊,会消耗更多的内存),但就性能而言,远离嵌套数据结构几乎肯定是您的最佳选择,而且实际上与您的数据表示兼容的 numpy/scipy 生态系统的数量。如果它真的使用更多的内存实际上是相当值得怀疑的;每个新的 python 对象都使用大量字节,因此如果每次嵌套只有几个元素,它也是内存效率更高的解决方案。

在这种情况下,这将为您提供以下有效的问题解决方案:

output = np.bincount(*resource_arr) * rndm

Numpy 将其数组视为矩阵,resource_arr 不是(有效)矩阵。在您的情况下,python 列表更合适:

def sum_nested(l):
    tmp = []

    for element in l:
        if isinstance(element, list):
            tmp.append(numpy.sum(element))
        else:
            tmp.append(element)

    return tmp

在此函数中,我们检查 l 中的每个元素是否为列表。如果是这样,我们对其元素求和。另一方面,如果遇到的元素只是一个数字,我们就让它保持不变。请注意,这仅适用于一层嵌套。

现在,如果我们 运行 sum_nested([[2, 3], 4, 2, [1, 2]]) 我们将得到 [5 4 2 3]。剩下的就是将这个结果乘以 rndm 的元素,这可以使用 numpy 轻松实现:

def fitness_score(a, b):
    return numpy.multiply(a, sum_nested(b))