あなたの質問は、ベクトル化された関数からどの出力を見たいかを正確に明確にしませんが、f()のすべての呼び出しに引数として同じリスト(A)を適用したいと思います(つまり、一度X配列の各要素に対して)
関数のベクトル化されたバージョンは、すべての引数が配列であることを確認し、次にnumpyのブロードキャストルールを適用して、これらの引数をどのように組み合わせるかを決定します。
np.arrayによるnp.ndarrayのラッピングと同様に、配列への引数の強制は、リストを含むdtype = objectの配列を作成するのではなく、リストを同じ要素を含む配列に自動的に変換することによって、役立つように試みます。その唯一の要素。ほとんどの場合、これは私たちが望んでいることですが、あなたの場合、この「スマートな」動作が戻ってきてあなたを噛みます。
特定の入力のみをベクトルとして扱うようにnumpyに指示する方法があるかもしれませんが、目的の動作を取得するための2つの簡単な方法があります。
- ブロードキャストルール内で機能するように、dtype=objectを使用して配列を手動で作成します
- 関数をベクトル化する前に値をカレーします
1. dtype = object
Numpy配列は、1つのタイプのアイテムのみを格納することで効率を引き出しますが、格納されるデータ型をpythonオブジェクトに指定することで、任意のpythonオブジェクトを含めることができます。
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
プリント:
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]
そして戻ります:
array([ 6. , 5.4 , 4.90909091, 4.5 , 4.15384615,
3.85714286, 3.6 , 3.375 , 3.17647059, 3. ])
2.カリー化
配列内の各項目の関数呼び出しに同じリストを渡すため、ベクトル化を適用する前にカリー化することで、関数とともにリストを直接保存できます。
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)
プリント:
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]
そして戻ります:
array([ 6. , 5.4 , 4.90909091, 4.5 , 4.15384615,
3.85714286, 3.6 , 3.375 , 3.17647059, 3. ])
PSまた、np.frompyfuncも確認することをお勧めします。これはvectorize()に似ていますが、わずかに低いレベルで機能します。