Twoje pytanie nie wyjaśnia dokładnie, jakie wyjście chciałbyś zobaczyć z funkcji wektorowej, ale zakładam, że chciałbyś, aby ta sama lista (A) była stosowana jako argument przy każdym wywołaniu f () (tj. raz dla każdego elementu w tablicy X)
Wektoryzowana wersja funkcji zapewnia, że wszystkie argumenty są tablicami, a następnie stosuje się numpy's broadcasting rules w celu określenia sposobu łączenia tych argumentów.
Podobnie jak w przypadku np.array zawijania np.ndarray, przymus argumentów do tablic próbuje być pomocny, automatycznie przekształcając listę w tablicę zawierającą te same elementy, zamiast tworzyć tablicę z dtype = object zawiera listę jako jedyny element. Najczęściej to jest to, czego chcemy, ale w twoim przypadku to "inteligentne" zachowanie wraca, by cię ugryźć.
Chociaż nie może być sposobem na instruować numpy tylko w leczeniu niektórych wejść jako wektory, są dwa proste sposoby, aby uzyskać zachowanie jesteś po:
- ręcznie utworzyć takie array with dtype=object do pracy w radiofonii zasady
- Curry wartość przed Wektoryzacja obok funkcji
1. dtype = obiekt
tablice numpy czerpią swoją efektywność z tylko przechowywania jeden typ elementu, ale mogą zawierać dowolne obiekty, określając, że składowany typu dane są obiekty Pythona:
list_obj_array = np.ndarray((1,), dtype=object)
list_obj_array[0] = [1,2,3]
f2(X,list_obj_array) # using your definition from above
drukuje:
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
i powroty:
array([ 6. , 5.4 , 4.90909091, 4.5 , 4.15384615,
3.85714286, 3.6 , 3.375 , 3.17647059, 3. ])
2.Currying
Ponieważ są przechodzącą tej samej listy do wywołania funkcji dla każdego elementu w tablicy, można przechowywać listę bezpośrednio z funkcji przez currying przed stosujące wektoryzacji:
def curry_f(A):
def f_curried(x):
return f(x, A) # using your definition from above
return f_curried
f2 = np.vectorize(curry_f(P))
f2(X)
odbitek:
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
i powroty:
array([ 6. , 5.4 , 4.90909091, 4.5 , 4.15384615,
3.85714286, 3.6 , 3.375 , 3.17647059, 3. ])
P.S. możesz również chcieć rzucić okiem na np.frompyfunc - jest podobny do wektoryzacji(), ale działa na nieco niższym poziomie.