Konvertieren Sie ein 1D-Array in ein 2D-Array in numpy


118

Ich möchte ein eindimensionales Array in ein zweidimensionales Array konvertieren, indem ich die Anzahl der Spalten im 2D-Array spezifiziere. Etwas, das so funktionieren würde:

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

Hat numpy eine Funktion, die wie meine erfundene Funktion "vec2matrix" funktioniert? (Ich verstehe, dass Sie ein 1D-Array wie ein 2D-Array indizieren können, aber das ist keine Option in dem Code, den ich habe - ich muss diese Konvertierung durchführen.)

Antworten:


162

Sie möchten reshapedas Array.

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

Dabei wird -1die Größe der neuen Dimension aus der Größe des Eingabearrays abgeleitet.


44

Sie haben zwei Möglichkeiten:

  • Wenn Sie die ursprüngliche Form nicht mehr möchten, können Sie dem Array am einfachsten eine neue Form zuweisen

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

    Sie können das a.size//ncolsby umschalten -1, um die richtige Form automatisch zu berechnen. Stellen Sie sicher, dass a.shape[0]*a.shape[1]=a.sizeSie sonst auf ein Problem stoßen.

  • Mit der np.reshapeFunktion können Sie ein neues Array erhalten , das hauptsächlich wie die oben dargestellte Version funktioniert

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

    Wenn es möglich ist, newwird nur eine Ansicht des anfänglichen Arrays angezeigt a, was bedeutet, dass die Daten gemeinsam genutzt werden. In einigen Fällen wird das newArray jedoch stattdessen kopiert. Beachten Sie, dass np.reshapeauch ein optionales Schlüsselwort akzeptiert wird order, mit dem Sie von der Zeilen-Haupt-C-Reihenfolge zur Spalten-Haupt-Fortran-Reihenfolge wechseln können. np.reshapeist die Funktionsversion der a.reshapeMethode.

Wenn Sie die Anforderung nicht erfüllen können a.shape[0]*a.shape[1]=a.size, müssen Sie kein neues Array erstellen. Sie können die np.resizeFunktion verwenden und mit np.reshapez

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

9

Versuchen Sie etwas wie:

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

Sie müssen jedoch sicherstellen, dass Sie die Anzahl der Elemente in Ihrem Array durch dividieren können ncols. Sie können auch mit der Reihenfolge spielen, in der die Zahlen Bmit dem orderSchlüsselwort abgerufen werden.


4

Wenn Sie nur ein 1d-Array X in ein 2d-Array konvertieren möchten, gehen Sie wie folgt vor:

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
Es ist besser, wenn Sie dem Code eine Erklärung hinzufügen.
Sid

Können Sie erklären, wie sich Ihre Antwort jetzt von der vorherigen und auch von den anderen Antworten oben unterscheidet, die ebenfalls np.reshape verwenden?
StupidWolf

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

oder einen neuen bekommen

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

Dadurch werden die Abmessungen +1 festgelegt, was dem Hinzufügen einer Klammer am äußersten Punkt entspricht


-1

Sie können flatten()aus dem numpy-Paket verwenden.

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}")

Ausgabe:

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
Könnten Sie Ihren Code teilen? Weil die Nummer sicher eine flattenMethode hat: docs.scipy.org/doc/numpy/reference/generated/…
Rafi

-2

Ändern Sie das 1D-Array in ein 2D-Array, ohne Numpy zu verwenden.

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.