2013-03-14 85 views
1

我試圖將數組A的每一行乘以另一個數組(B)中所有行的每一行以便獲得len(A)具有相同行數的數組和列作爲前兩個數組。Python Numpy中的數組行乘法循環

任何幫助?

pseudo-code 
from numpy import * 
import numpy as np 

def multipar(): 
    A = array([ (0.1,0.5,0.2,0.2), (0.2,0.5,0.1,0.2), (0.7,0.1,0.1,0.1) ]) 
    B = array([ (1,2,3,4), (2,3,4,5), (3,4,5,6) ]) 
    for i in len(A): 
     average = A[i]*B 
    print average 

multipar() 

我想有各自產生的新陣列

Array C 
(0.1,0.5,0.2,0.2) * (1,2,3,4); 
(0.1,0.5,0.2,0.2) * (2,3,4,5); 
(...) 
Array D 
(0.2,0.5,0.1,0.2) * (1,2,3,4); 
(...) 

回答

2

你可以做一些與高維有趣。將AB擴展到第三維,然後將其與未擴展的相乘。 例如: -

A = array([ (0.1,0.5,0.2,0.2), (0.2,0.5,0.1,0.2), (0.7,0.1,0.1,0.1) ]) 
B = array([ (1,2,3,4), (2,3,4,5), (3,4,5,6) ]) 

tiled = tile (B, (3,1,1)).swapaxes (0,1) 
all_results = A*tiled 

現在你把所有的all_results你的結果陣列;您可以輕鬆地all_results[0]all_results[1],讓他們等

編輯:在回答最新的問題編輯: 如果你真的需要的結果陣列分開,然後有另外兩個選擇:

  • C, D, E = all_results
  • 替換在我的第一個建議的最後兩個語句與:

    C = B * A [0]

    d = B * A [1]

    E = B * A [2]

如果確實需要的結果單獨的陣列,並與許多更多的行,使得一個循環是必需的,那麼你可以這樣做(感謝@Jaime用於廣播符號)

all_results = A[:, None, :] * B[None, :, :] 
for i, res in enumerate (all_results): 
    locals() ['result%d'%i] = res 

現在,通過第一行相乘的結果是在一個名爲res1變量,在res2第二行,依此類推。

+0

感謝您的幫助。分開放置結果數組會更好。由於我的真實數據比這個例子有更多的行,你將如何實現你的最後一個循環選項?它與我的pscode有什麼不同?最好的問候 – Pedro9 2013-03-14 20:34:18

+2

@lxop你不需要平鋪,而是使用廣播!如果'A.shape =(r,t)'和'B.shape =(s,t)',那麼'C = A [:,None,:] * B [None,:,]' '(r,s,t)'和'C [0]'將是'A'的第一行與'B'的乘積。 'A [:,無,:]'等價於'A.reshape(r,1,t)'和'B [None,:,]'與B.reshape(1,s,t )'。廣播重複使用數據,而平鋪複製數據,所以前者更快,使用內存少於後者。 – Jaime 2013-03-14 21:05:05

+0

@佳美優點,謝謝。 – lxop 2013-03-15 01:04:54