1
votes

construire une matrice par paires à partir d'un vecteur dans tensorflow

Supposons que j'ai un vecteur 1 * 3 [[1,3,5]] (ou une liste comme [1,3,5] si vous avec ), comment générer une matrice 9 * 2: [[1,1], [1,3], [1,5], [3,1], [3,3], [3,5 ], [5,1], [5,3], [5,5]] ?

Les éléments de la nouvelle matrice sont la combinaison par paire d'éléments de la matrice d'origine.

De plus, la matrice d'origine pourrait être avec des zéros, comme ceci [[0,1], [0,3], [0,5]] .

La mise en œuvre devrait se généraliser aux vecteurs de toutes les dimensions.

Merci beaucoup!


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser produit depuis itertools

from itertools import product
np.array([np.array(item) for item in product([1,3,5],repeat =2 )])


array([[1, 1],
       [1, 3],
       [1, 5],
       [3, 1],
       [3, 3],
       [3, 5],
       [5, 1],
       [5, 3],
       [5, 5]])


1 commentaires

Merci! mais je demande une implémentation tensorflow.



1
votes

Vous pouvez utiliser tf.meshgrid () et tf.transpose () pour générer deux matrices. Puis remodelez-les et concattez-les.

import tensorflow as tf

a = tf.constant([[1,3,5]])

A,B=tf.meshgrid(a,tf.transpose(a))
result = tf.concat([tf.reshape(B,(-1,1)),tf.reshape(A,(-1,1))],axis=-1)

with tf.Session() as sess:
    print(sess.run(result))

[[1 1]
 [1 3]
 [1 5]
 [3 1]
 [3 3]
 [3 5]
 [5 1]
 [5 3]
 [5 5]]


3 commentaires

Le tf.reshape (B, (- 1,1)) est intéressant, je n'ai pas trouvé d'exemple similaire de cette utilisation dans le document officiel tensorflow.org/api_docs/python/tf/reshape .


@ clement116 Ce document d'utilisation existe déjà. Similaire à reshape (t, [2, -1]) et reshape (t, [-1, 9]) dans les exemples.


@ clement116 De rien. Veuillez l'accepter si vous n'avez aucune question.



0
votes

Je propose également une réponse, similaire à @giser_yugang, mais sans utiliser tf.meshgrid et tf.concat.

import tensorflow as tf 

inds = tf.constant([1,3,5])

num = tf.shape(inds)[0]
ind_flat_lower = tf.tile(inds,[num])
ind_mat = tf.reshape(ind_flat_lower,[num,num])
ind_flat_upper = tf.reshape(tf.transpose(ind_mat),[-1])
result = tf.transpose(tf.stack([ind_flat_upper,ind_flat_lower]))

with tf.Session() as sess:
    print(sess.run(result))


[[1 1]
 [1 3]
 [1 5]
 [3 1]
 [3 3]
 [3 5]
 [5 1]
 [5 3]
 [5 5]]


0 commentaires