2
votes

NumPy: y a-t-il une meilleure façon de construire une matrice spécifique avec une valeur spécifique?

J'ai réussi à construire une matrice avec ce morceau de code

array([[ 1.,  1.],
       [ 2.,  1.],
       [ 3.,  2.],
       [nan,  2.]])

qui donne

c_bed = np.append(np.array([1, 2, 3]), np.nan).reshape(4, 1)
c_bath = np.array([1, 1, 2, 2], dtype=np.float).reshape(4, 1)
ds = np.append(c_bed, c_bath, axis=1)

la sortie est exactement ce que je voulez cependant, je me demande s'il existe une meilleure façon de construire cette matrice?


0 commentaires

4 Réponses :


1
votes

Que diriez-vous d'utiliser zip_longest

from itertools import zip_longest
np.array(list(zip_longest([1,2,3],[1,1,2,2],fillvalue=np.nan)))
Out[228]: 
array([[ 1.,  1.],
       [ 2.,  1.],
       [ 3.,  2.],
       [nan,  2.]])


2 commentaires

Définissez fillvalue = np.nan et vous obtenez un tableau numérique.


np.array (list (zip_longest ([1,2,3], [1,1,2,2])), 'd') fonctionne également.



1
votes

Y a-t-il une raison de ne pas utiliser ce matrix = numpy.array ([[1, 1], [2, 1], [3, 2], [numpy.nan, 2]]) ?


3 commentaires

Je pense que l'hypothèse est que les listes originales sont des données entrantes


Je suis heureux de mettre à jour ma réponse si le PO démontre que c'est le cas.


J'étais heureux de voter pour cela tel quel. C'est la meilleure réponse à la question telle qu'elle est.



1
votes

Si vous avez

ds = np.full((max(map(len, data)), 2), np.nan)
ds[:len(beds), 0] = beds
ds[:len(baths), 1] = baths

Vous pouvez faire comme suit:

beds = [1, 2, 3]
baths = [1, 1, 2, 2]
data = (beds, baths)


0 commentaires

0
votes

Avertissement: la méthode suivante est peut-être la plus courte, mais ce n'est certainement pas la plus saine. Je ne l'utiliserais pas dans le code de production.

np.c_[[2,4,6,np.nan],2:6]//2
# array([[ 1.,  1.],
#        [ 2.,  1.],
#        [ 3.,  2.],
#        [nan,  2.]])


0 commentaires