2012-12-05 15 views
61

Say Mam tablicę a:Od ND do 1D tablic

a = np.array([[1,2,3], [4,5,6]]) 

array([[1, 2, 3], 
     [4, 5, 6]]) 

chciałbym, aby przekształcić go 1D tablicy (czyli wektor kolumnowy):

b = np.reshape(a, (1,np.product(a.shape))) 

ale zwraca

array([[1, 2, 3, 4, 5, 6]]) 

który nie jest taki sam jak:

array([1, 2, 3, 4, 5, 6]) 

mogę wziąć pierwszy element tej tablicy ręcznie konwertować je do 1D tablicy:

b = np.reshape(a, (1,np.product(a.shape)))[0] 

ale wymaga to mnie wiedzieć, ile wymiary oryginału tablica ma (i złączyć [0]” s przy pracy z wyższymi wymiarami)

Czy istnieje niezależny od wymiarów sposób pozyskiwania wektora kolumny/wiersza z dowolnego ndarray?

Odpowiedz

130

Zastosowanie np.ravel (na widoku 1D) lub np.flatten (na 1D kopii) lub np.flat (za 1D iteracyjnej):

In [12]: a = np.array([[1,2,3], [4,5,6]]) 

In [13]: b = a.ravel() 

In [14]: b 
Out[14]: array([1, 2, 3, 4, 5, 6]) 

Należy zauważyć, że ravel() zwraca view z a jeśli to możliwe. Zatem modyfikowanie b modyfikuje także a. ravel() zwraca wartość view, gdy elementy 1D sąsiadują z pamięcią, ale zwrócą wartość copy, jeśli na przykład a zostały wykonane z cięcia innej macierzy przy użyciu nie-jednostkowego rozmiaru kroku (na przykład a = x[::2]).

Jeśli chcesz kopię zamiast widoku, użyj

In [15]: c = a.flatten() 

Jeśli chcesz tylko iterator, użyj np.flat:

In [20]: d = a.flat 

In [21]: d 
Out[21]: <numpy.flatiter object at 0x8ec2068> 

In [22]: list(d) 
Out[22]: [1, 2, 3, 4, 5, 6] 
+1

W tym przykładzie le, 'ravel()' zwraca widok, ale nie zawsze tak jest. Zdarzają się przypadki, w których 'ravel()' zwraca kopię.

+0

@WarrenWeckesser: To prawda. Dziękuję za wskazanie tego. – unutbu

13
In [14]: b = np.reshape(a, (np.product(a.shape),)) 

In [15]: b 
Out[15]: array([1, 2, 3, 4, 5, 6]) 

lub po prostu:

In [16]: a.flatten() 
Out[16]: array([1, 2, 3, 4, 5, 6]) 
+2

Może użyć 'b = a.reshape (-1)' dla krótkiego w pierwszym przykładzie. –