2015-11-01 40 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() 
相关问题