2017-06-20 77 views
-1

我的一个函数生成一个结果作为一个可变长度的列表,如[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的阵列我想要的格式?我似乎无法得到它的工作。

+0

后者是绝对有可能并且容易和有效地与NumPy的完成。 – ForceBru

回答

0

该解决方案允许您使用np.pad。直觉就是找出哪个列表较大,然后用列表长度差异填充较小的列表。

import numpy as np 
def add(l1, l2): 
    maxlen = max(len(l1), len(l2)) 
    return np.pad(l1, (0, maxlen - len(l1)), mode='constant')/
     + np.pad(l2, (0, maxlen - len(l2)), mode='constant') 

演示:

>>> add(add([0, 0, 0, 2], add([1, 2], [3])), [3, 1]) 
array([7, 3, 0, 2]) 

至于你的第二个操作,它可以与numpy的广播完成,只要你在numpy的数组操作。

>>> x 
array([4, 2]) 
>>> x/2. 
array([ 2., 1.]) 
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.]) 

函数的第一行是那里得到这些阵列转换为浮点的副本,所以可以不进行以后四舍五入分裂。

+0

'a,b = map(np.asfarray,(a,b))'超难读。为什么不简单地'a = a.astype(float)'和'b = b.astype(float)'?另外,为什么'Add'关心后面的部门呢?如果开发者决定他们需要一个部门,他们应该自己投入“浮动”。 –

+0

@NilsWerner,因为这对我来说看起来更简单和更清晰(并且超级容易阅读),并且还需要少一行并产生相同的结果。 – ForceBru

+0

事实上,你需要在你的文字中解释这一行说,除了你之外,其他任何人都难以阅读。 –

0

另一种解决方案:

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]) 
+0

我认为这只适用于如果你的最短矩阵是第一个参数 - 在这种情况下,我们不知道长度。 – Nate

+0

我查过了,它在两种情况下都有效。你说出你的问题的方式听起来像你总是想返回一个与参数'a'相同长度的数组。 –

2

就可以得到功能地图/ itertools.izip_longest做在Python 2.x或itertools.zip_longest在Python 3.X

随着中说,

  • 遍历map函数结果中的所有元素
  • 对于each子列表,可以使用sum()Python的内置函数。
  • 来处理无值,检查None是否存在于each变量中。如果存在,则通过该子列表迭代,每一个元素i被检查,如果这是无,如果是的话,然后用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 in,转换分子或分母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)] 
+0

我打算提供一个izip_longest的答案,但我看到你提到它。你没有提供一个例子,所以可以随意使用:'from itertools import izip_longest as izip_l' 'sum = [a + b for a,b in izip_l(arr1,arr2,fillvalue = 0)] ' – Baldrickk

+0

我会将您的评论添加为编辑!谢谢! :) –