2017-06-20 76 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

我會將您的評論添加爲編輯!謝謝! :) –