матрица, разделенная на строки другой матрицы, без петли в центре.
Какова эквивалентная реализация кода 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
Что мне нужно сделать, так это разделить столбцы "а "на каждую строку"в". В конце концов, будет 4 матрицы размером 3*2 (размер "а"), где каждая "а" делится на одну из строк "в".
- С уважением
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()