矩阵除以另一个矩阵的行,在theano中没有循环

时间:2015-12-03 16:34:23

标签: python matrix linear-algebra division theano

如果不使用循环,下面代码的等效theano实现是什么?

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中的循环也可以替换为:

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

我需要做的是将每行“b”的“a”列分开。最后,将有4个大小为3 * 2的矩阵(大小为“a”),其中每个矩阵都是“a”除以“b”行之一。

-Regards

1 个答案:

答案 0 :(得分: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()