2015-11-01 18 views
-2

我有這兩個數組:添加兩個不使用for的數組。 Python的

import numpy as np 
a = np.array([0, 10, 20]) 
b = np.array([20, 30, 40, 50]) 

我倒是喜歡這兩個以下列方式增加,同時避免緩慢的Python for循環:

c = array([20, 30, 40, 50, 30, 40, 50, 60, 40, 50, 60, 70]) 

這意味着,對於「第一要素a「添加b的所有元素,然後添加第二個元素等等。

我知道這似乎很容易,但對於龐大的數組,Python循環太慢了。

謝謝。

+2

這有什麼錯'for'循環? – TigerhawkT3

+1

你的數組是什麼? numpy,array.array? –

+0

在列表解析中做'for'計數? ;) – Pynchia

回答

2

在這裏你去:

In [17]: a = np.array([0, 10, 20]) 

In [18]: b = np.array([20, 30, 40, 50]) 

In [19]: (a.reshape(-1, 1) + b).ravel() 
Out[19]: array([20, 30, 40, 50, 30, 40, 50, 60, 40, 50, 60, 70]) 

下面是詳細信息。

a.reshape(-1, 1)轉換a與形狀的陣列(3,1):

In [20]: a.reshape(-1, 1) 
Out[20]: 
array([[ 0], 
     [10], 
     [20]]) 

b被添加到的是,broadcasting適用,這實際上不「外總和」(即增加了所有的成對的組合),形成具有形狀(3,4)的陣列:

In [21]: a.reshape(-1, 1) + b 
Out[21]: 
array([[20, 30, 40, 50], 
     [30, 40, 50, 60], 
     [40, 50, 60, 70]]) 

ravel() method變平結果成一維數組:

In [22]: (a.reshape(-1, 1) + b).ravel() 
Out[22]: array([20, 30, 40, 50, 30, 40, 50, 60, 40, 50, 60, 70]) 

請參閱@HYRY的答案,以獲得更加簡潔的版本。

-2

首先,您需要指定數組類型,如果使用類似的構造函數。例如,對於整數,使用:

a = array("i",[0, 10, 20])  # signed int type 
b = array("i",[20, 30, 40, 50]) 

他們,你可能想使用,同時設有專櫃循環,它比用於較爲複雜,但避免了循環。

from array import array 

a = array("i",[0, 10, 20]) # signed int 

b = array("i",[20, 30, 40, 50]) 

c = array("i",[]) 

count1 = 0 

while count1 < len(a): 
    count2 = 0 
    while count2 < len(b): 
     c.append(a[count1]+b[count2]) 
     count2 += 1 
    count1 += 1 

print(c) 
+0

OP已經在使用'numpy';不需要切換到另一個Python'array'模塊。 – hpaulj

0

一個可能的且只有內存不是時間密集型的解決方案是使用np.repeatnp.resize來重複數組a和b,並將其重新調整爲最終形狀的大小,然後簡單地添加這兩個數組。

代碼:

import numpy as np 
a = np.array([0, 10, 20]) 
b = np.array([20, 30, 40, 50]) 

def extend_and_add(a, b): 
    return np.repeat(a, len(b)) + np.resize(b, len(a)*len(b)) 

所以extend_and_add(a, b)回報:

extend_and_add(a, b) 
> array([20, 30, 40, 50, 30, 40, 50, 60, 40, 50, 60, 70]) 

說明:

基本上np.repeat(a, len(b))重複:

a 
> array([ 0, 10, 20]) 

np.repeat(a, len(b)) 
> array([ 0, 0, 0, 0, 10, 10, 10, 10, 20, 20, 20, 20]) 

在此之後,你需要np.resize調整第二陣列:

b 
> array([20, 30, 40, 50]) 

調整爲:

np.resize(b, len(a)*len(b)) 
> array([20, 30, 40, 50, 20, 30, 40, 50, 20, 30, 40, 50]) 

現在,我們可以簡單地添加數組:

array([ 0, 0, 0, 0, 10, 10, 10, 10, 20, 20, 20, 20]) 
+ 
array([20, 30, 40, 50, 20, 30, 40, 50, 20, 30, 40, 50]) 

回報:

array([20, 30, 40, 50, 30, 40, 50, 60, 40, 50, 60, 70]) 
1

可以使用ufunc的外方法:

np.add.outer(a, b).ravel()