2012-10-26 13 views
6

mam szereg obiektów numpy zawierającej kilka listy indeksów:Dlaczego funkcja wektoryzacji numpy najwyraźniej nazywa się dodatkowym czasem?

>>> idxLsts = np.array([[1], [0, 2]], dtype=object) 

zdefiniować zwektoryzowany funkcji dodać wartość do każdej listy:

>>> idx = 99 
>>> f = np.vectorize(lambda idxLst: idxLst.append(idx)) 

Przyzywam funkcję. Nie dbam o wartość zwrotu, tylko efekt uboczny.

>>> f(idxLsts) 
array([None, None], dtype=object) 

Indeks 99 został dodany dwukrotnie do pierwszej listy. Czemu? Jestem zdumiony.

>>> idxLsts 
array([[1, 99, 99], [0, 2, 99]], dtype=object) 

Przy innych wartościach idxLsts, że nie nastąpi to:

>>> idxLsts = np.array([[1, 2], [0, 2, 4]], dtype=object) 
>>> f(idxLsts) 
array([None, None], dtype=object) 
>>> idxLsts 
array([[1, 2, 99], [0, 2, 4, 99]], dtype=object) 

Moje podejrzenie jest to związane z dokumentacją, która mówi: „Definiowanie vectorized funkcję, która pobiera zagnieżdżony sekwencja obiektów lub numpy tablic jako danych wejściowych i zwraca tablicę numpy jako wynik.Wizualizowana funkcja ocenia pyfunc nad kolejnymi krotkami tablic wejściowych, takich jak funkcja map Pythona, z tym wyjątkiem, że używa zasad transmisji numpy. "

Odpowiedz

7

Z vectorize docstring:

The data type of the output of `vectorized` is determined by calling 
the function with the first element of the input. This can be avoided 
by specifying the `otypes` argument. 

I od kodu:

 theout = self.thefunc(*newargs) 

Jest to dodatkowy wywołanie thefunc, używane do określenia typu wyjściowego. Dlatego pierwszym elementem jest dołączenie dwóch dołączonych 99.

Takie zachowanie się dzieje w drugim przypadku także:

import numpy as np 
idxLsts = np.array([[1, 2], [0,2,4]], dtype = object) 
idx = 99 
f = np.vectorize(lambda x: x.append(idx)) 
f(idxLsts) 
print(idxLsts) 

daje

[[1, 2, 99, 99] [0, 2, 4, 99]] 

Można użyć np.frompyfunc zamiast np.vectorize:

import numpy as np 
idxLsts = np.array([[1, 2], [0,2,4]], dtype = object) 
idx = 99 
f = np.frompyfunc(lambda x: x.append(idx), 1, 1) 
f(idxLsts) 
print(idxLsts) 

daje

[[1, 2, 99] [0, 2, 4, 99]] 
+0

a-moll przypis: Odkryłem, że choć docs powiedzieć, że to zachowanie „można uniknąć poprzez określenie' otypes' argumentu”dostarczanie' otypes' nie wyklucza podwójnego połączenia (przynajmniej w wersji 1.6.2). – senderle

+1

@senderle: Dzięki. Nie mogłem również uniknąć podwójnego wywołania, z wyjątkiem określania 'otypes = '?', ** i **' f.nout = 1' ** i ** 'f.lastcallargs = 1', co wydaje się troszkę szalone :) – unutbu