2015-04-08 13 views
6

mam numpy tablicę, która wygląda tak:jak mogę spłaszczyć tablicę 2d numpy, która ma różną długość w drugiej osi?

myArray = np.array([[1,2],[3]]) 

Ale nie mogę go wyprostować,

In: myArray.flatten() 
Out: array([[1, 2], [3]], dtype=object) 

Gdybym zmienić tablicę do tej samej długości w drugiej osi, to mogę wyprostować to.

In: myArray2 = np.array([[1,2],[3,4]]) 
In: myArray2.flatten() 
Out: array([1, 2, 3, 4]) 

Moje pytanie brzmi:

Czy mogę korzystać z niektórych rzeczy jak myArray.flatten() bez względu na wymiar tablicy oraz długość jego elementów i uzyskać wynik: array([1,2,3])?

+2

NumPy nie obsługuje tablic ragged i nie ma sensu używać NumPy do tablic obiektów (w tym przypadku list), jak w tym pytaniu. na przykład '2 * myArray' da ci tablicę' [([[1, 2, 1, 2], [3, 3]], dtype = object) '. Możesz ponownie przemyśleć swój problem lub zadać pytanie o to, co dzieje się na wcześniejszym etapie kodu. – YXD

Odpowiedz

4

myArray to jednowymiarowa tablica obiektów . Twoje obiekty na liście pozostaną w tej samej kolejności z flatten() lub ravel(). Można użyć hstack stosu tablic w sekwencji poziomo:

>>> np.hstack(myArray) 
array([1, 2, 3]) 

Zauważ, że to jest w zasadzie równoważne użyciu concatenate z osi 1 (powinno to mieć sens intuicyjnie):

>>> np.concatenate(myArray, axis=1) 
array([1, 2, 3]) 

Jeśli jednak masz , to nie ma problemu z tym, że i można połączyć, zawsze lepiej jest użyć flatten() lub ravel() dla wydajności:

In [1]: u = timeit.Timer('np.hstack(np.array([[1,2],[3,4]]))'\ 
    ....: , setup = 'import numpy as np') 
In [2]: print u.timeit() 
11.0124390125 

In [3]: u = timeit.Timer('np.array([[1,2],[3,4]]).flatten()'\ 
    ....: , setup = 'import numpy as np') 
In [4]: print u.timeit() 
3.05757689476 

Iluengo's answer także pozwoli Ci uzyskać dalsze informacje, dlaczego nie można używać flatten() lub ravel() podane twój typ array.

+0

Dzięki za odpowiedź bardzo! Czy to oznacza, co może zrobić spłaszczanie() lub ravel(), czy też hstack() i concatenate(), które są bardziej ogólne? – xirururu

+0

@xirururu Zobacz moją zaktualizowaną odpowiedź. – miradulo

3

np.hstack prace w tym przypadku

In [69]: np.hstack(myArray) 
Out[69]: array([1, 2, 3]) 
8

Cóż, zgadzam się z innymi odpowiedziami, gdy mówią, że hstack lub concatenate wykonać zadanie w tej sprawie. Chciałbym jednak wskazać, że nawet jeśli "rozwiązuje" problem, problem nie jest właściwie rozwiązywany.

Problem polega na tym, że nawet jeśli wygląda na to, że druga oś ma inną długość, nie jest to prawdą w praktyce. Jeśli spróbujesz:

>>> myArray.shape 
(2,) 
>>> myArray.dtype 
dtype('O') # stands for Object 
>>> myArray[0] 
[1, 2] 

To pokazuje, że tablica nie jest tablicą 2D o zmiennej wielkości (jak można sądzić), to tylko 1D tablicę obiektów. W twoim przypadku elementy to list, będąc pierwszym elementem twojej tablicy, składającą się z 2 elementów, a drugim elementem tablicy jest lista 1-elementowa.

Tak więc, flatten i ravel nie będzie działać, ponieważ przekształcenie tablicy 1D w tablicę 1D daje dokładnie taką samą tablicę 1D. Jeśli masz tablicę numpy object, nie dba o to, co umieścisz w środku, potraktuje poszczególne elementy jako nieznane przedmioty i nie będzie mogła zdecydować, jak je scalić.

To, co należy wziąć pod uwagę, to takie zachowanie, jakiego oczekujesz w swojej aplikacji. Macierze Numpy są szczególnie wydajne dzięki macierzom numerycznym o stałym rozmiarze. Jeśli grasz z tablicami obiektów, nie rozumiem, dlaczego chciałbyś używać Numpy zamiast zwykłych list Pythona.

+0

Jestem nowy w Pythonie, Numpy dostarcza wiele przydatnych funkcji, więc nie muszę pisać długich kodów tylko dla małych wartości, takich jak +, -, suma ... :-) – xirururu

+4

@xirururu ale, co próbowałem punkt, jest to, że twoja tablica nie jest 2D. Jeśli wypróbujesz 'myArray + myArray', wynikiem będzie' tablica ([[1, 2, 1, 2], [3, 3]], dtype = object) 'co do której jestem pewien, że nie jest tym, czego oczekiwałeś. Aby użyć '+', '-' i' sum' musisz utworzyć numeryczną tablicę, i aby to zrobić, powinien on mieć stały rozmiar. –

+0

Dzięki @iluengo. Naprawdę nigdy nie spodziewałem się tego problemu ... :( – xirururu

Powiązane problemy