2015-12-03 88 views
2

什麼是不使用循環的下面代碼的等效實現?矩陣除以另一個矩陣的行,在沒有循環的情況下

ainvb=a[:,:,None]/b 

我需要做的是分裂的「一」,由「B」的每一行列:

dt = np.dtype(np.float32) 

a=[[12,3], 
    [2,4], 
    [2,4],] 

b=[[12,3,2,3], 
    [2,4,4,5]] 

a=np.asarray(a,dtype=dt) 
b=np.asarray(b,dtype=dt) 
print(a.shape) 
print(b.shape) 
ainvb=np.zeros((3,2,4)) 
for i in range(4): 
    ainvb[:,:,i]=a/b[:,i].T 

在numpy的也迴路可以替換。最後,將會有4個大小爲3 * 2的矩陣(a的大小),其中每個矩陣都被「b」的行中的一個劃分。

-Real

+0

您是否嘗試過在Theano中使用numpy解決方案? Theano打算在很大程度上覆制numpy API,因此像這樣的表達式可以完全按照Theano中的預期工作。 –

+0

@DanielRenshaw你的意思是同樣的表達也可能在theano中起作用?我會試一下! – PickleRick

回答

1

這在Theano中的工作方式與在numpy中的工作方式相同。下面是一個比較三種方法的腳本:

import numpy as np 
import theano 
import theano.tensor as tt 


def numpy_v1(a, b): 
    ainvb = np.zeros((3, 2, 4)) 
    for i in range(4): 
     ainvb[:, :, i] = a/b[:, i].T 
    return ainvb 


def numpy_v2(a, b): 
    return a[:, :, None]/b 


def compile_theano_v1(): 
    a, b = tt.matrices('a', 'b') 
    return theano.function([a, b], a[:, :, None]/b) 


def main(): 
    dt = np.dtype(np.float32) 

    a = [[12, 3], 
     [2, 4], 
     [2, 4], ] 

    b = [[12, 3, 2, 3], 
     [2, 4, 4, 5]] 

    a = np.asarray(a, dtype=dt) 
    b = np.asarray(b, dtype=dt) 
    print(a.shape) 
    print(b.shape) 

    theano_v1 = compile_theano_v1() 

    numpy_v1_ainvb = numpy_v1(a, b) 
    numpy_v2_ainvb = numpy_v2(a, b) 
    theano_v1_ainvb = theano_v1(a, b) 

    assert np.allclose(numpy_v1_ainvb, numpy_v2_ainvb) 
    assert np.allclose(numpy_v2_ainvb, theano_v1_ainvb) 


main() 
+0

謝謝!你是對的。它也適用於theano。 – PickleRick