Convertir un tableau 1D en un tableau 2D dans numpy


118

Je souhaite convertir un tableau à 1 dimension en un tableau à 2 dimensions en spécifiant le nombre de colonnes dans le tableau 2D. Quelque chose qui fonctionnerait comme ceci:

> import numpy as np
> A = np.array([1,2,3,4,5,6])
> B = vec2matrix(A,ncol=2)
> B
array([[1, 2],
       [3, 4],
       [5, 6]])

Est-ce que numpy a une fonction qui fonctionne comme ma fonction inventée "vec2matrix"? (Je comprends que vous pouvez indexer un tableau 1D comme un tableau 2D, mais ce n'est pas une option dans le code que j'ai - je dois effectuer cette conversion.)

Réponses:


163

Vous voulez reshapele tableau.

B = np.reshape(A, (-1, 2))

-1déduit la taille de la nouvelle dimension à partir de la taille du tableau d'entrée.


44

Vous avez deux options:

  • Si vous ne voulez plus la forme d'origine, le plus simple est simplement d'attribuer une nouvelle forme au tableau

    a.shape = (a.size//ncols, ncols)

    Vous pouvez basculer le a.size//ncolsby -1pour calculer automatiquement la forme appropriée. Assurez-vous que a.shape[0]*a.shape[1]=a.size, sinon vous rencontrerez un problème.

  • Vous pouvez obtenir un nouveau tableau avec la np.reshapefonction, qui fonctionne principalement comme la version présentée ci-dessus

    new = np.reshape(a, (-1, ncols))

    Lorsque c'est possible, ce newsera juste une vue du tableau initial a, ce qui signifie que les données sont partagées. Dans certains cas, cependant, le newtableau sera une copie à la place. Notez que cela np.reshapeaccepte également un mot order- clé facultatif qui vous permet de passer de l'ordre C principal de la ligne à l'ordre Fortran de la colonne principale. np.reshapeest la version fonctionnelle de la a.reshapeméthode.

Si vous ne pouvez pas respecter l'exigence a.shape[0]*a.shape[1]=a.size, vous êtes obligé de créer un nouveau tableau. Vous pouvez utiliser la np.resizefonction et la mélanger avec np.reshape, comme

>>> a =np.arange(9)
>>> np.resize(a, 10).reshape(5,2)

9

Essayez quelque chose comme:

B = np.reshape(A,(-1,ncols))

Vous devrez cependant vous assurer de pouvoir diviser le nombre d'éléments de votre tableau ncols. Vous pouvez également jouer avec l'ordre dans lequel les nombres sont tirés en Butilisant le ordermot - clé.


4

Si votre seul objectif est de convertir un tableau 1d X en un tableau 2d, faites simplement:

X = np.reshape(X,(1, X.size))

0
import numpy as np
array = np.arange(8) 
print("Original array : \n", array)
array = np.arange(8).reshape(2, 4)
print("New array : \n", array)

1
Il vaut mieux que vous incluiez des explications avec le code.
Sid

Pouvez-vous expliquer en quoi votre réponse est maintenant différente de la précédente et des autres réponses ci-dessus, qui utilisent également np.reshape?
StupidWolf

0
some_array.shape = (1,)+some_array.shape

ou en obtenir un nouveau

another_array = numpy.reshape(some_array, (1,)+some_array.shape)

Cela rendra les dimensions +1, ce qui équivaut à l'ajout d'une parenthèse à l'extérieur


-1

Vous pouvez utiliser à flatten()partir du package numpy.

import numpy as np
a = np.array([[1, 2],
       [3, 4],
       [5, 6]])
a_flat = a.flatten()
print(f"original array: {a} \nflattened array = {a_flat}")

Production:

original array: [[1 2]
 [3 4]
 [5 6]] 
flattened array = [1 2 3 4 5 6]

AttributeError: module 'numpy' has no attribute 'flatten'
Jamie F

1
Pouvez-vous partager votre code? Parce que le numpy a bien sûr une flattenméthode: docs.scipy.org/doc/numpy/reference/generated/…
Rafi

-2

Changez le tableau 1D en tableau 2D sans utiliser Numpy.

l = [i for i in range(1,21)]
part = 3
new = []
start, end = 0, part


while end <= len(l):
    temp = []
    for i in range(start, end):
        temp.append(l[i])
    new.append(temp)
    start += part
    end += part
print("new values:  ", new)


# for uneven cases
temp = []
while start < len(l):
    temp.append(l[start])
    start += 1
    new.append(temp)
print("new values for uneven cases:   ", new)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.