[英]Adding arrays of variable length
我的其中一个函数将结果生成为可变长度列表,例如[1、2、3,...]等。随着这些列表的出现,我想以这种方式将它们全部添加到某个主列表中:
out: [1, 2]
out: [3]
sum:[4,2]
out: [0, 0, 0, 2]
sum: [4, 2, 0, 2]
out: [3, 1]
sum: [7, 3, 0, 2]
等等。
我还需要能够对这些进行操作-类似:
[1, 2, 3, 4]/N = [1/N, 2/N, ...]
numpy数组是我想要的格式吗? 我似乎无法正常工作。
您可以使用python 2.x中的map / itertools.izip_longest或python 3.x中的itertools.zip_longest完成功能
照这样说,
each
子列表,您可以使用python的sum()内置函数。 each
变量中是否None
。 如果存在,则遍历该子列表,检查每个元素i
是否为None,如果存在,则将其替换为0。 那是,
>>> addFn = lambda a,b: [sum(each) if None not in each else sum(i if i else 0 for i in each )for each in map(None,a,b)]
>>> addFn([1,2,3],[4])
[5, 2, 3]
>>> addFn(addFn([1,2,3],[4]),[7,3,0,2])
[12, 5, 3, 2]
对于第二种功能,如果l
是您的列表,则
对于l中的每个元素i
,请转换分子或分母float并执行运算!
>>> divByN = lambda l,N:[i/float(N) for i in l]
>>> divByN([5,6,7,8],2)
[2.5, 3.0, 3.5, 4.0]
如Baldrickk所述,这是itertools的示例,
from itertools import izip_longest as izip_l
sum = [a+b for a,b in izip_l(arr1,arr2, fillvalue=0)]
import numpy as np
def Add(a, b):
a, b = map(np.array, (a, b))
if a.size > b.size:
a[:b.size] += b
return a
else:
b[:a.size] += a
return b
用法示例:
>>> Add([1,2], [3])
array([ 4., 2.])
>>> Add([0,0,0,2], _)
array([ 4., 2., 0., 2.])
该函数的第一行是将这些数组的副本转换为浮点数的方法,因此您可以在不进行舍入的情况下进行除法。
另一个解决方案:
def add_shortest(a, b):
a = numpy.array(a)
b = numpy.array(b)
common_length = min(a.size, b.size)
a[:common_length] += b[:common_length]
return a
add_shortest(numpy.arange(2), numpy.arange(3)) # array([0, 2])
add_shortest(numpy.arange(3), numpy.arange(3)) # array([0, 2, 4])
add_shortest(numpy.arange(3), numpy.arange(2)) # array([0, 2, 2])
add_shortest(add_shortest([0, 0, 0, 2], add_shortest([1, 2], [3])), [3, 1]) # array([7, 3, 0, 2])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.