使用 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))
我正在尝试在 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))