簡體   English   中英

添加可變長度的數組

[英]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完成功能

照這樣說,

  • 遍歷map函數結果中的所有元素
  • 對於each子列表,您可以使用python的sum()內置函數。
  • 要處理none值,請檢查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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM