Konwertuj tablicę 1D na tablicę 2D w numpy

118

Chcę przekonwertować tablicę 1-wymiarową na tablicę 2-wymiarową, określając liczbę kolumn w tablicy 2D. Coś, co działałoby tak:

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

Czy numpy ma funkcję, która działa jak moja stworzona funkcja „vec2matrix”? (Rozumiem, że możesz indeksować tablicę 1D, podobnie jak tablicę 2D, ale nie jest to opcja w kodzie, który mam - muszę dokonać tej konwersji.)

Alex Williams
źródło

Odpowiedzi:

163

Chcesz do reshapetablicy.

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

gdzie -1wnioskuje rozmiar nowego wymiaru z rozmiaru tablicy wejściowej.

Matt Ball
źródło
44

Masz dwie możliwości:

  • Jeśli nie potrzebujesz już oryginalnego kształtu, najłatwiej jest po prostu przypisać nowy kształt do tablicy

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

    Możesz przełączyć się a.size//ncols, -1aby automatycznie obliczyć odpowiedni kształt. Upewnij się, że a.shape[0]*a.shape[1]=a.sizeinaczej napotkasz jakiś problem.

  • Możesz uzyskać nową tablicę za pomocą np.reshapefunkcji, która działa głównie tak, jak wersja przedstawiona powyżej

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

    Gdy będzie to możliwe, newbędzie to tylko widok początkowej tablicy a, co oznacza, że ​​dane są udostępniane. Jednak w niektórych przypadkach newtablica będzie zamiast tego acopy. Zauważ, że np.reshapeakceptuje również opcjonalne słowo kluczowe, orderktóre umożliwia przełączanie się z głównego porządku w wierszu C na główny w kolumnie porządek w języku Fortran. np.reshapejest wersją funkcji a.reshapemetody.

Jeśli nie możesz spełnić wymagań a.shape[0]*a.shape[1]=a.size, utkniesz z koniecznością utworzenia nowej tablicy. Możesz użyć tej np.resizefunkcji i mieszać ją z np.reshape, takimi jak

>>> a =np.arange(9)
>>> np.resize(a, 10).reshape(5,2)
Pierre GM
źródło
9

Spróbuj czegoś takiego:

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

Musisz jednak upewnić się, że możesz podzielić liczbę elementów w tablicy ncols. Możesz także bawić się kolejnością, w jakiej liczby są przyciągane, Bużywając ordersłowa kluczowego.

JoshAdel
źródło
4

Jeśli Twoim jedynym celem jest przekonwertowanie 1-wymiarowej tablicy X na 2-wymiarową, po prostu wykonaj:

X = np.reshape(X,(1, X.size))
Bieg
źródło
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)
Ayush Kapri
źródło
1
Lepiej jest dołączyć wyjaśnienie wraz z kodem.
Sid
Czy możesz wyjaśnić, czym teraz twoja odpowiedź różni się od poprzedniej, a także innych odpowiedzi powyżej, które również używają np.reshape?
StupidWolf
0
some_array.shape = (1,)+some_array.shape

lub zdobądź nowy

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

Spowoduje to, że wymiar +1 będzie równy dodaniu wspornika na najbardziej zewnętrznym

ZDL-tak
źródło
-1

Możesz użyć flatten()z pakietu 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}")

Wynik:

original array: [[1 2]
 [3 4]
 [5 6]] 
flattened array = [1 2 3 4 5 6]
Rafi
źródło
AttributeError: module 'numpy' has no attribute 'flatten'
Jamie F
1
Czy mógłbyś udostępnić swój kod? Ponieważ numpy z pewnością ma flattenmetodę: docs.scipy.org/doc/numpy/reference/generated/ ...
Rafi
-2

Zmień tablicę 1D na tablicę 2D bez używania 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)
Ayush Kapri
źródło