Эквивалент Tensorflow этого декартова произведения по оси numpy для 2D-матриц

В настоящее время у меня есть код, который позволяет использовать комбинаторное (декартово) произведение по определенной оси. Это в numpy и возникло из предыдущего вопроса or-tens">Эффективное осевое декартово произведение нескольких 2D-матриц с помощью Numpy или TensorFlow

A = np.array([[1,2],
              [3,4]])
B = np.array([[10,20],
              [5,6]])
C = np.array([[50, 0],
              [60, 8]])
cartesian_product( [A,B,C], axis=1 )
>> np.array([[ 1*10*50, 1*10*0, 1*20*50, 1*20*0, 2*10*50, 2*10*0, 2*20*50, 2*20*0] 
             [ 3*5*60,  3*5*8,  3*6*60,  3*6*8,  4*5*60,  4*5*8,  4*6*60,  4*6*8]])

и повторить решение:

L = [A,B,C]  # list of arrays
n = L[0].shape[0]
out = (L[1][:,None]*L[0][:,:,None]).reshape(n,-1)
for i in L[2:]:
    out = (i[:,None]*out[:,:,None]).reshape(n,-1)

Существует ли существующий метод для выполнения этого с трансляцией в тензорном потоке - без цикла for?


person undercurrent    schedule 11.06.2017    source источник


Ответы (1)


Итак, мне удалось найти чистый (частичный) ответ на основе tf для двух массивов. В настоящее время это не обобщается, как решение numpy для массивов M, но это для другого вопроса (возможно, tf.while_loop). Для тех, кому любопытно, решение адаптировано из Оценить все парные комбинации строк двух тензоров в тензорном потоке

a = np.array([[0, 1, 2, 3],
              [4, 5, 6, 7],
              [4, 5, 6, 7]])

b = np.array([[0, 1],
              [2, 3],
              [2, 3]])

N = a.shape[0]

A = tf.constant(a, dtype=tf.float64)
B = tf.constant(b, dtype=tf.float64)

A_ = tf.expand_dims(A, axis=1)
B_ = tf.expand_dims(B, axis=2)
z = tf.reshape(tf.multiply(A_, B_), [N, -1])

>> tf_result
Out[1]: 
array([[  0.,   0.,   0.,   0.,   0.,   1.,   2.,   3.],
       [  8.,  10.,  12.,  14.,  12.,  15.,  18.,  21.],
       [  8.,  10.,  12.,  14.,  12.,  15.,  18.,  21.]])

Решения для случая с несколькими массивами приветствуются

person undercurrent    schedule 11.06.2017