2016-07-26 5 views
1

단일 플로트를 취해 단일 플로트를 반환하는 foo() 함수가 있습니다. numpy 행렬 또는 배열의 모든 요소에이 함수를 적용하는 가장 빠르고/가장 평범한 방법은 무엇입니까?numpy 행렬의 모든 요소에 대해 연산을 수행하는 방법은 무엇입니까?

은 내가 기본적으로 필요한 것은 루프를 사용하지 않는 코드의 버전입니다 :

import numpy as np 

big_matrix = np.matrix(np.ones((1000, 1000))) 

for i in xrange(np.shape(big_matrix)[0]): 

    for j in xrange(np.shape(big_matrix)[1]): 

     big_matrix[i, j] = foo(big_matrix[i, j]) 

저는 제가 천국 '그러나이 작업을 수행 할 수 있도록 할 NumPy와 문서에서 뭔가를 찾기 위해 노력했다 아무것도 찾지 못했습니다.

편집 : 의견에서 언급했듯이 구체적으로 내가해야 할 기능은 시그 모이 드 기능인 f(z) = 1/(1 + exp(-z))입니다.

+0

벡터화가 대답이라는 데 동의합니다. foo()가하는 함수를 다시 생각해보기를 원할 것입니다. 현재는 개별 요소에서 작동합니다. 벡터화는 전체 행/열을 한꺼번에 조작하여 루프를 제거하는 것을 의미합니다. –

+1

'np.vectorize'는 일반적으로 일반적으로 가장 "파이썬"입니다. 그러나 어떤 함수'foo'의 경우 함수를 전혀 사용하지 않고'numpy' 벡터 연산을 사용하면 더 잘 수행 할 수 있습니다 ('np.vectorize'는 계산을보다 효율적으로 수행하기 위해 아무 것도하지 않기 때문에 더 잘 할 수 있습니다)). – mgilson

+0

나는 특별히 시그 모이 드 함수를 사용하려고한다. 즉'f (z) = 1/(1 + exp (-z)) ' –

답변

3

foo이 실제로 스칼라를 가져 와서 스칼라를 반환하는 블랙 박스이면 어떤 종류의 반복을 사용해야합니다. 사람들은 종종 np.vectorize을 시도하고 문서화 된대로 많은 것을 빠르게하지 않는다는 것을 깨닫습니다. 여러 입력을 방송하는 방법으로 가장 유용합니다. 약간 더 빠르지 만 인터페이스가 덜 편리한 np.frompyfunc을 사용합니다.

적절한 numpy 방법은 배열과 함께 작동하도록 함수를 변경하는 것입니다. 귀하의 의견에있는 기능으로하기가 어렵지 않아야합니다.

f(z) = 1/(1 + exp(-z)) 

np.exp 기능이 있습니다. 나머지는 간단한 수학입니다.

+0

실제 문제가 해결 되었기 때문에 받아 들여집니다. 나는 이것을 반영하기 위해 나의 질문을 바꾸었다. –

관련 문제