2017-12-04 3 views
0

2 개의 객체를 인수로 취하여 길이가 m이고 n이 2 인 ndarrays를 취하여 모양의 행렬 (m x n)을 반환하는 함수를 벡터화하고자합니다. Kinda는 텐서 생성물과 유사합니다.2 파이썬 객체에 함수를 벡터화

나는 많은 성공없이 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 * matrix *로 실제로'a'가 필요합니까? Numpy 행렬은 실제로는 거의 없습니다. –

+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)도 작동으로 잘 작동하지만, 매트릭스로의 전환이 필요하지 않습니다 내 , 일반적으로 권장하지 않습니다.