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!
3 Réponses :
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]])
Merci! mais je demande une implémentation tensorflow.
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]]
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.
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]]