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

问题描述 投票:0回答:1

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

我有一个 random binary array rndm = [1, 0, 1, 1] 和a 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. 

对于这一点,我想是因为我想做的加法。任何帮助将被感激。谢谢你!我想在Python中使用numpy来解决我的项目。

python arrays python-3.x numpy equation-solving
1个回答
1
投票

我认为你重建的方式是 resource_arr 不是一个有效的numpy数组,因为numpy将数组视为矩阵。因此使用 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))

1
投票

Numpy是关于非锯齿数组的. 你可以用锯齿形数组来做一些事情,但是要做到高效和优雅并不是一件容易的事情。

几乎所有的时候,都会想办法把你的数据结构映射到一个非嵌套的数据结构中,例如,把信息编码成下面的样子,会更灵活,性能也更高。

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

也就是用一个整数表示每个值所属的 "行",并配上一个大小相等的值本身的数组。

当来自C风格的数组方式时,这可能会 "感觉 "很浪费(OMG更多的内存消耗),但从性能方面来说,远离嵌套数据结构几乎肯定是你最好的选择,而且numpyscipy生态系统的数量实际上将与你的数据表示兼容。如果它真的使用更多的内存其实是相当值得怀疑的,每一个新的python对象都会使用大量的字节,所以如果你每次嵌套只有很少的元素,它也是更节省内存的解决方案。

在这种情况下,就会给你以下高效的解决方案。

output = np.bincount(*resource_arr) * rndm

0
投票

我还没怎么用过 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)
© www.soinside.com 2019 - 2024. All rights reserved.