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]]