2013-02-16 10 views
14

Jak układać kolumny pod kątem n wektory kształtu (x,) gdzie x może być dowolną liczbą?Jak układać wektory o różnych długościach w NumPy?

Na przykład

from numpy import * 
a = ones((3,)) 
b = ones((2,)) 

c = vstack((a,b)) # <-- gives an error 
c = vstack((a[:,newaxis],b[:,newaxis])) #<-- also gives an error 

hstack działa dobrze, ale Łączy wzdłuż złym wymiarze.

Odpowiedz

21

Krótka odpowiedź: nie możesz. NumPy nie obsługuje natywnie tablic strzępiastych.

Długa odpowiedź:

>>> a = ones((3,)) 
>>> b = ones((2,)) 
>>> c = array([a, b]) 
>>> c 
array([[ 1. 1. 1.], [ 1. 1.]], dtype=object) 

daje tablicę może lub nie może zachowywać zgodnie z oczekiwaniami. Na przykład. nie obsługuje podstawowych metod, takich jak sum lub reshape, i powinieneś traktować to tak, jakbyś potraktował zwykłą listę Pythona [a, b] (iteruj nad nią, aby wykonywać operacje zamiast używania wektoryzowanych idiomów).

Istnieje kilka możliwych obejść; najłatwiej jest zmusić a i b do wspólnej długości, być może używając masked arrays lub NaN do sygnalizowania, że ​​niektóre indeksy są nieprawidłowe w niektórych wierszach. Na przykład. oto b jako maskowane tablicy:

>>> ma.array(np.resize(b, a.shape[0]), mask=[False, False, True]) 
masked_array(data = [1.0 1.0 --], 
             mask = [False False  True], 
       fill_value = 1e+20) 

ten może być łączony z a następująco:

>>> ma.vstack([a, ma.array(np.resize(b, a.shape[0]), mask=[False, False, True])]) 
masked_array(data = 
[[1.0 1.0 1.0] 
[1.0 1.0 --]], 
      mask = 
[[False False False] 
[False False True]], 
     fill_value = 1e+20) 

(Dla niektórych celów scipy.sparse może być również interesujące).

+0

dodać do roztworu larsmans', aby znaleźć największy swoimi «postrzępione» tablic, można użyć ' max_entries = max ([len (x) dla x w [a, b]])), i aby automatycznie wygenerować maskę, użyj 'np.concatenate ([np.zeros (len (b), dtype = bool), np .ones (max_entries-len (b), dtype = bool)]) '. –

+0

Z pewnością musi być jakiś sposób! Jeśli tablica jednowymiarowa w numpy przechowuje jedynie wskaźniki obiektów w innych wielowymiarowych tablicach, to dlaczego tablice wielowymiarowe muszą być takie same? Na pewno nie? Pomoc doceniona. – CodeCabbie

3

Ogólnie rzecz biorąc, to niejednoznaczność w łączeniu tablic o różnej długości, ponieważ wyrównanie danych może mieć znaczenie. Pandas ma różne zaawansowane rozwiązania, aby sobie z tym poradzić, np. scalić serie w daneFrame.

Jeśli chcesz wypełniać kolumny zaczynając od pierwszego elementu, zwykle robię tworzenie macierzy i wypełnianie kolumn. Oczywiście trzeba wypełnić puste przestrzenie w matrycy o zerowej wartości (w tym przypadku np.nan)

a = ones((3,)) 
b = ones((2,)) 
arraylist=[a,b] 

outarr=np.ones((np.max([len(ps) for ps in arraylist]),len(arraylist)))*np.nan #define empty array 
for i,c in enumerate(arraylist): #populate columns 
    outarr[:len(c),i]=c 

In [108]: outarr 
Out[108]: 
array([[ 1., 1.], 
     [ 1., 1.], 
     [ 1., nan]]) 
Powiązane problemy