2012-04-16 65 views
4

在python中,我希望從1-dim數組中逐行減去2-dim數組。Python和numpy:逐行減去1-dim數組中的2-dim數組

我知道如何用'for'循環和索引來做到這一點,但我想它可能會更快地使用numpy函數。但是我沒有找到辦法做到這一點。下面是一個例子「for」循環:

from numpy import * 
x=array([[1,2,3,4,5],[6,7,8,9,10]]) 
y=array([20,10]) 
j=array([0, 1]) 
a=zeros([2,5]) 
for i in j : 
...  a[i]=y[i]-x[i] 

而且這裏的東西,不工作的例子,通過這個替換「for」循環:

a=y[j]-x[j,i] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: shape mismatch: objects cannot be broadcast to a single shape 

竇您有任何建議?

+4

作爲一個建議,我會避免做一個名爲'j'的列表變量。語法方面,這是可以的,但大多數程序員在一個循環中爲計數器保留字母「i,j,k」,從而導致一些可能的混淆。 – Hooked 2012-04-16 17:39:51

回答

7

問題是,y-x有各自的形狀(2) (2,5)。要做適當的廣播,你需要形狀(2,1) (2,5)。我們可以只要元件的數量將被保留與.reshape做到這一點:

y.reshape(2,1) - x 

給出:

array([[19, 18, 17, 16, 15], 
    [ 4, 3, 2, 1, 0]]) 
+1

非常感謝! – 2012-04-16 18:23:33

+2

沒問題,歡迎來到Stack Overflow! – Hooked 2012-04-16 18:27:20

2
y[:,newaxis] - x 

應該工作了。 (小)比較的好處是你注意尺寸本身,而不是尺寸的大小。