Converti un array 1D in un array 2D in numpy


118

Voglio convertire un array unidimensionale in un array bidimensionale specificando il numero di colonne nell'array 2D. Qualcosa che funzionerebbe in questo modo:

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

Numpy ha una funzione che funziona come la mia funzione inventata "vec2matrix"? (Capisco che puoi indicizzare un array 1D come un array 2D, ma questa non è un'opzione nel codice che ho - devo fare questa conversione.)

Risposte:


163

Vuoi reshapel'array.

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

dove -1deduce la dimensione della nuova dimensione dalla dimensione della matrice di input.


44

Hai due opzioni:

  • Se non desideri più la forma originale, il modo più semplice è assegnare una nuova forma all'array

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

    È possibile passare a.size//ncolsda a -1per calcolare automaticamente la forma corretta. Assicurati di farlo a.shape[0]*a.shape[1]=a.size, altrimenti incorrerai in qualche problema.

  • Puoi ottenere un nuovo array con la np.reshapefunzione, che funziona principalmente come la versione presentata sopra

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

    Quando è possibile, newsarà solo una visualizzazione dell'array iniziale a, il che significa che i dati sono condivisi. In alcuni casi, tuttavia, l' newarray sarà invece una copia. Tieni presente che np.reshapeaccetta anche una parola chiave opzionale orderche ti consente di passare dall'ordine C principale di riga all'ordine Fortran principale di colonna. np.reshapeè la versione della funzione del a.reshapemetodo.

Se non riesci a rispettare il requisito a.shape[0]*a.shape[1]=a.size, sei bloccato dalla necessità di creare un nuovo array. Puoi usare la np.resizefunzione e mescolarla con np.reshape, come

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

9

Prova qualcosa come:

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

Dovrai assicurarti di poter dividere il numero di elementi nel tuo array per ncols. Puoi anche giocare con l'ordine in cui i numeri vengono inseriti Butilizzando la orderparola chiave.


4

Se il tuo unico scopo è convertire un array 1d X in un array 2d, basta fare:

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
È meglio includere alcune spiegazioni insieme al codice.
Sid

Puoi spiegare in che modo la tua risposta ora è diversa dalla precedente e anche dalle altre risposte sopra, che usano anche np.reshape?
StupidWolf

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

o ottenerne uno nuovo

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

Questo renderà le dimensioni +1, equivalenti all'aggiunta di una parentesi nella parte più esterna


-1

Puoi usare flatten()dal pacchetto 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}")

Produzione:

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
Potresti condividere il tuo codice? Perché il numpy ha sicuramente un flattenmetodo: docs.scipy.org/doc/numpy/reference/generated/…
Rafi

-2

Cambia l'array 1D in array 2D senza usare 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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.