2012-11-25 7 views
9

두 개의 입력 배열 x와 y가 같은 모양입니다. 함수를 통해 일치하는 인덱스로 각 요소를 실행 한 다음 결과를 세 번째 배열 z에있는 해당 인덱스에 저장해야합니다. 이것을 이루기위한 가장 무난한 방법은 무엇입니까? 바로 지금 네 개의 네 개의 루프가 있습니다. 더 쉬운 방법이있을 것입니다.배열 단위 작업 배열

x = [[2, 2, 2], 
    [2, 2, 2], 
    [2, 2, 2]] 

y = [[3, 3, 3], 
    [3, 3, 3], 
    [3, 3, 1]] 

def elementwise_function(element_1,element_2): 
    return (element_1 + element_2) 

z = [[5, 5, 5], 
    [5, 5, 5], 
    [5, 5, 3]] 

내 기능이 개별 데이터 쌍에서만 작동하므로 혼란스러워집니다. x 및 y 배열을 함수에 단순히 전달할 수는 없습니다.

+1

NumPy와 배열은 기본적으로 현명 요소이다. 즉, x + y = z – user1767344

+1

매트릭스 레벨에서 연산을 수행 할 수 있으면 좋을까요? 예를 들어, 위의 예에서'z = x + y'가 작동합니다. 아마도 우리는 당신의 기능이 무엇인지를 보여줄 수 있으며 우리는 그것이 당신이 매트릭스에서 작업하도록 도울 수 있습니까? –

답변

12

"쉬운 방법"은 numpy.vectorize을 사용하여 NumPy 인식 기능을 만드는 것입니다. "ufunc"는 요소 단위 함수에 대한 NumPy 용어입니다 (설명서 here 참조). numpy.vectorize을 사용하면 요소 별 함수를 사용하여 다른 NumPy ufuncs (표준 추가 등)와 같은 방식으로 작동하는 고유 한 ufunc를 만들 수 있습니다. ufunc는 배열을 받아들이고 각 쌍에 함수를 적용합니다 요소의 경우, 표준 NumPy 함수처럼 배열 모양의 브로드 캐스팅을 수행합니다. documentation page에는 도움이 될만한 몇 가지 사용 예제가 있습니다.

4

(나는 당신이 numpy.array을, 간단한 파이썬 list에 대해서 이야기하고 있지 추측하고있어)

재귀 항상 우리의 삶을 더 쉽게 :

def operate_on_Narray(A, B, function): 
    try: 
     return [operate_on_Narray(a, b, function) for a, b in zip(A, B)] 
    except TypeError as e: 
     # Not iterable 
     return function(A, B) 

사용법 :

>>> x = [[2, 2, 2], 
...  [2, 2, 2], 
...  [2, 2, 2]] 
>>> 
>>> y = [[3, 3, 3], 
...  [3, 3, 3], 
...  [3, 3, 1]] 
>>> operate_on_Narray(x, y, lambda a, b: a+b) 
[[5, 5, 5], [5, 5, 5], [5, 5, 3]] 

그것은에서 작동합니다 다른 종류의 치수 배열 :

>>> operate_on_Narray([1, 2, 3], [4, 5, 6], lambda a, b: a*b) 
[4, 10, 18] 
1

파이썬 2.7.3 인터프리터 세션의 다음 내용은 내장 함수 map을 사용하여 2D 행렬 요소에 요소 단위 연산을 적용하는 방법을 보여줍니다. (참고 : operator.addapplier 번째 사용 람다 표현식 질문에 지정된 elementwise_function에 상당하고, 또한 동일하다.)

>>> import operator 
>>> def applier(a, b, op): 
...  return map(lambda ro: map(op, ro[0], ro[1]), zip(a,b)) 
... 
>>> applier(x, y, operator.add) 
[[5, 5, 2], [5, 4, 5], [6, 5, 5]] 
>>> x; y 
[[2, 2, 1], [2, 2, 2], [3, 2, 2]] 
[[3, 3, 1], [3, 2, 3], [3, 3, 3]] 
>>> applier(x, y, lambda p,q: p+q) 
[[5, 5, 2], [5, 4, 5], [6, 5, 5]] 
>>> applier(x, y, lambda p,q: p-q) 
[[-1, -1, 0], [-1, 0, -1], [0, -1, -1]] 
>>> applier(x, y, lambda p,q: p*q) 
[[6, 6, 1], [6, 4, 6], [9, 6, 6]]