2017-12-04 9 views
0

2つのオブジェクトを引数として取り、2つのndarray(長さmとn)を取り、形の行列(m x n)を返す関数をベクトル化したいと思います。 キンダーテンソルのような製品。2つのpythonオブジェクトの関数をベクトル化する

私は多くの成功なしnumpy.vectorizeを使用しようとしました:

vFunc = np.vectorize(myFunc) 
arg1 = np.asmatrix(a) 
arg2 = np.transpose(np.asmatrix(b)) 
test = vFunc(arg1,arg2) 

は上記動作しません、今の私は醜いソリューションである配列、のいずれかに反復する必要がありますので。これをどうやって解決するのですか?

vFunc = np.vectorize(myFunc) 
arg1 = np.asmatrix(a) 
arg2 = np.transpose(np.asmatrix(b)) 
for i in range(arg1.size): cMat[i,] = vFunc(arg1[i],arg2) 
+0

例として 'myFunc'、' a'、 'b'を投稿すると多くの助けになります。 –

+0

実際にnumpy配列ではなくnumpy *行列*として 'a'が必要ですか?ナンシー行列は実際にはまれです。 –

+1

また、パフォーマンスが問題になりますか? 'np.vectorize'を使うのは本質的にループなので –

答えて

1

これは、基本的なvectorize設定です:

In [420]: def myfunc(x,y): 
    ...:  return 10*x + y 
    ...: 
In [421]: f = np.vectorize(myfunc) 
In [422]: f(np.arange(4), np.arange(3)[:,None]) 
Out[422]: 
array([[ 0, 10, 20, 30], 
     [ 1, 11, 21, 31], 
     [ 2, 12, 22, 32]]) 

どのようにあなたの場合は違うのですか? 「それはうまくいかない」と言うだけではありません!

この特定の機能を使用すると、私もvectorizeを必要としない:

In [423]: myfunc(np.arange(4), np.arange(3)[:,None]) 
Out[423]: 
array([[ 0, 10, 20, 30], 
     [ 1, 11, 21, 31], 
     [ 2, 12, 22, 32]]) 

myfunc内のアクションが既にbroadcasting

myfunc(np.asmatrix(np.arange(4)), np.asmatrix(np.arange(3)).T)で細かい作業も動作しますが、行列への変換が必要とされていません一般には推奨されません。

関連する問題