3
votes

Ajouter des tableaux numpy avec des dimensions différentes

J'essaye de joindre ou de concaténer deux tableaux numpy avec des dimensions différentes. Cela n'a pas l'air bien jusqu'à présent.

Donc, à titre d'exemple,

[0,1,2].

Et j'essaye

G = [[0, 1, 2, 3],
     [0, 1, 2]]

J'obtiens une erreur car a et b ne sont pas de la même dimension. La raison pour laquelle j'ai besoin de concaténer a et b est que j'essaie de résoudre un modèle de manière récursive et que l'espace d'états change avec le temps. J'ai donc besoin d'appeler la dernière fonction de valeur comme entrée pour obtenir une fonction de valeur pour la prochaine période, etc.:

for t in range(T-1,0,-1):

    VG,CG = findv(VT[-1])

    VT = np.append(VT,VG,axis=0)  
    CT = np.append(CT,CG,axis=0) 

Mais, VT a une dimension différente de la période de temps à la suivante.

Est-ce que quelqu'un sait comment gérer les tableaux VT et CT numpy qui changent constamment de dimension?

OK - merci pour l'entrée ... J'ai besoin que la sortie soit de la forme suivante:

G = np.concatenate(a,b,axis=0)

Donc, si j'écris G [- 1] J'obtiendrai le dernier élément,

a = np.arange(0,4).reshape(1,4)
b = np.arange(0,3).reshape(1,3)

Je ne sais pas si c'est un tableau numpy?

Merci, Jesper.


8 commentaires

np.concatenate ((a, b), axis = 0) des parenthèses supplémentaires sont cruciales


np.hstack ([a, b])


Je pense que cela devrait être le long de l'axe 1 ici @MadPhysicist, étant donné la refonte


@yatu je suis d'accord, poster comme réponse


G est une liste. Laissez-le comme ça.


@terman Si l'une des réponses ci-dessous répond à votre question, à la manière dont ce site fonctionne, vous «accepteriez» la réponse, mais seulement si votre question a vraiment été répondue. Sinon, pensez à ajouter plus de détails à la question


Oui, merci @Martin. Vous avez répondu à ma question merci.


@terman J'ai seulement essayé de faire remarquer que si quelqu'un répond à votre question, le site fonctionne d'une certaine manière, que vous `` acceptez '' sa réponse en cliquant sur le symbole spécial ...


4 Réponses :


2
votes

Essayez de cette façon:

import numpy as np
a = np.arange(4).reshape(2,2)
b = np.arange(6).reshape(2,3)
c = np.arange(8).reshape(2,4)
a
# array([[0, 1],
#       [2, 3]])
b
# array([[0, 1, 2],
#       [3, 4, 5]])
c
# array([[0, 1, 2, 3],
#       [4, 5, 6, 7]])
np.hstack((a,b,c))
#array([[0, 1, 0, 1, 2, 0, 1, 2, 3],
#       [2, 3, 3, 4, 5, 4, 5, 6, 7]])

J'espère que cela vous aidera. Merci


0 commentaires

2
votes

Il vous manque une parenthèse ici.

Veuillez vous référer à la documentation concaténée ci-dessous.

https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.concatenate.html

array([[0, 1, 2, 3, 0, 1, 2]])


4 commentaires

ok, je vois ... et si j'ai besoin que la matrice c soit [[0,1,2,3], [0,1,2]], pour que je puisse appeler c [-1] = [0, 1,2]?


Vous ne pouvez pas avoir un tableau en lambeaux


Essayez ceci et dites-moi si c'est ce que vous recherchez, définissez les tableaux sans remodeler, puis np.c _ [[a, b]]


J'ai donc écrit a = np.arange (0,4) et b = np.arange (0,3) et G_npy = np.array ([a, b]). Ce qui semble correct. Ensuite, je reçois une mise à jour que je dois ajouter au G_npy. Appelez cela c = np.arange (0,7). Comment ajouter c à la liste G_npy? Si j'écris G_npy = np.c _ [[G_npy, c]] j'obtiens quelque chose qui ne semble pas correct. J'ai besoin de G_npy = array ([[array ([0, 1, 2, 3])], [array ([0, 1, 2])], [array ([0, 1, 2, 3, 4, 5 , 6])]], dtype = objet).



2
votes

Vous ne pouvez pas vraiment empiler des tableaux avec des dimensions ou des tailles de dimensions différentes.

Voici la liste (type de sortie souhaitée si je comprends bien):

temp = [i for i in G_npy]
temp.append(np.arange(5))
G_npy = np.array(temp)

Transformé au tableau numpy:

G_npy = np.array([a,b])
G_npy = np.append(G_npy,None) # Allocate space for your new array
G_npy[-1] = np.arange(5) # populate the new space with new array

>>> G_npy
array([array([0, 1, 2, 3]), array([0, 1, 2]), array([0, 1, 2, 3, 4])],
      dtype=object)
>>>

Solution dans votre cas (en fonction de vos besoins):

a = np.arange(0,4)
b = np.arange(0,3)
G_npy = np.array([a,b])

>>> G_np.shape 
(2,)

>>> G_np 
array([array([0, 1, 2, 3]), array([0, 1, 2])], dtype=object)

>>> G_npy[-1]
array([0, 1, 2])

Modifier: En ce qui concerne votre question en commentaire

Je dois admettre que je n'ai aucune idée de comment le faire correctement.

Mais si un moyen de piratage est ok (peut-être que c'est la bonne façon), alors:

G_np = np.array(G)

>>> G_np.shape 
(2,)
>>> G_np 
array([list([0, 1, 2, 3]), list([0, 1, 2])], dtype=object)
>>>

Ou de cette façon - mais alors, il ne sert à rien d'utiliser numpy

G = [[0, 1, 2, 3],
     [0, 1, 2]]

REMARQUE:

Pour être honnête, je ne pense pas que numpy soit bon pour collecter des objets (liste comme celle-ci). Si j'étais vous, je continuerais à ajouter une vraie liste. À la fin, je le transformerais en numpy. Mais après tout, je ne connais pas votre candidature, donc je ne sais pas quelle est la meilleure attitude


1 commentaires

cela semble beaucoup mieux ... J'ai une question cependant ... Je reçois beaucoup de mises à jour de la liste G_np ... alors disons que G_np est maintenant égal à array ([array ([0, 1, 2, 3 ]), tableau ([0, 1, 2])], dtype = objet). définissons c = np.arange (0,7) et je dois "ajouter" cela à G_np ... Je fais G_npy = np.array ([G_npy, c]). Mais maintenant, je ne peux pas identifier les éléments individuels de G_npy! G_npy [0] est array ([array ([0, 1, 2, 3]), array ([0, 1, 2])], dtype = object) dont je ne veux pas ... j'ai besoin de G_npy [0 ] = tableau [0,1,2,3]?



4
votes
In [83]: cc = np.array([None])
In [84]: cc[0]= c
In [85]: cc
Out[85]: array([array([0, 1, 2, 3, 4, 5, 6])], dtype=object)
In [86]: np.concatenate((G,cc))
Out[86]: 
array([array([0, 1, 2, 3]), array([0, 1, 2]),
       array([0, 1, 2, 3, 4, 5, 6])], dtype=object)

0 commentaires