1
votes

Comment transférer un tableau 2-D dans un tableau 1-D?

J'ai un tableau numpy 2D arr:

vec = [1, 0, 0, 2, 0, 0]

Je veux le convertir en vecteur 1-D:

array([[0., 1., 0.],
       [1., 0., 0.],
       [1., 0., 0.],
       [0., 0., 1.],
       [1., 0., 0.],
       [1., 0., 0.]]

Les valeurs 0, 1 et 2 doivent correspondre à une colonne de art , dans laquelle la valeur est égale à 1.

Y a-t-il des non- pour faire une boucle?


2 commentaires

np.nonzero (votre_array) [1]


np.argmax (arr, 1) . Cela suppose qu'il y a un seul 1 par ligne (sinon le premier sera choisi)


3 Réponses :


1
votes

Essayez numpy. différent de zéro :

>>> np.where(a)[1]
array([1, 0, 0, 2, 0, 0])

ou numpy. où :

>>> import numpy as np
>>> a = np.array([[0., 1., 0.],
...               [1., 0., 0.],
...               [1., 0., 0.],
...               [0., 0., 1.],
...               [1., 0., 0.],
...               [1., 0., 0.]])
>>> np.nonzero(a)[1]
array([1, 0, 0, 2, 0, 0])


0 commentaires

0
votes

Vous pouvez utiliser des matrices mathématiques pour résoudre ce problème car vous n'avez qu'une seule valeur non nulle par ligne. Un simple produit scalaire avec un vecteur "position" vous donnera le résultat souhaité. Vous voulez émuler l'équation matricielle A * x = y, et tant que x est un vecteur colonne, vous vous retrouverez avec un vecteur colonne comme réponse.

>>> x = (2,4,8)
>>> np.dot(a,x)
array([4., 2., 2., 8., 2., 2.])

En utilisant cette méthode, vous pouvez changer votre vecteur de "position" pour être ce que vous voulez et il "indexera" de manière appropriée (je mets cela entre guillemets car c'est une astuce mathématique). Par exemple:

>>> import numpy as np
>>> a = np.array([[0., 1., 0.],
...               [1., 0., 0.],
...               [1., 0., 0.],
...               [0., 0., 1.],
...               [1., 0., 0.],
...               [1., 0., 0.]])
>>> x = (0,1,2)
>>> y = np.dot(a,x)
>>> y
array([1., 0., 0., 2., 0., 0.])


1 commentaires

Pour généraliser un peu cela, vous pouvez utiliser a.dot (np.arange (a.shape [1]))



0
votes
>>> np.nonzero(a==1)[1]
array([1, 0, 0, 2, 0, 0], dtype=int64)

>>> np.where(a==1)[1]
array([1, 0, 0, 2, 0, 0], dtype=int64)

>>> np.where(a>0)[1]
array([1, 0, 0, 2, 0, 0], dtype=int64)

0 commentaires