2013-11-22 2 views
1

함수 호출 f(m1) 여기서 m1은 numpy 행렬입니다. 지금, 나는 m1 거의 동일 행렬에 f를 호출하고 싶습니다 : 그 작업을 수행하는 우아한 f(...) 한 줄이numpy 행렬의 단일 요소를 업데이트하는 Python 방법?

m2 = m1.copy() 
m2[ 2, 7 ] = 43 # or m2[ 2, 7 ] += 43 
f(m2) 

있습니까? 당신이 할 수 있도록

+1

이 바로 그것을 할 수있는 방법입니다. 그러나 코드가 같은 시간에'm1'과'm2'를 생성 할 수있는 방식으로 구성되어 있다면,보다 우아하고 효율적인 방법이있을 수 있습니다. – shx2

답변

1

파이썬에서 모든 임무는 성명 아닌 표현이다 -

f(m2[2,7] = 43) 

또는

if (a = 1+2)

을 나는 당신이 할 수 있다고 생각

f(modify_matrix(m1)) 

m1 행렬을 수정하기위한 별도의 메소드를 정의한다.

def modify_matrix(m1): 
    m1[2,7] = 2 
    return m1 

위의 옵션은 행렬을 수정하는 데 한 줄 더 더 추가하면됩니다.

0

교육학적인 측면에서 볼 때 다음과 같은 기능적 방법이 있습니다. np.where 실제로 당신이 원하는 것을 정확히 않지만, 까다로운 부분은 아닌 인덱스 부울 조건을 받아들이는 것입니다 : condition이 충족되는 곳, 다른 곳에서 그냥 m1를 전송 43f에 전송

f(np.where(condition, 43, m1)) 

를, 그래서 이것은 것 변경할 요소를 선택하기위한 기준을 알고 있다면 더 간단 할 것입니다. 따라서, 가장 까다로운 부분은 부울 배열을 만드는 것입니다. 어쨌든 조금 낭비입니다.

np.where(np.all(np.indices(m1.shape) == np.array([2, 7])[:, None, None], 0), 43, m1) 

또는 동등 :

np.where(np.all(np.rollaxis(np.indices(m1.shape),0,3) == np.array([2, 7]), -1), 43, m1) 

나는 마스크 대신 인덱스를했다 상응하는 기능이 있었다 맹세 할 수 있지만, 불행하게도 그것은 인덱스를 취하는 유사한 기능 (np.put, 예를 들어)를 보인다 기능적으로 새 배열을 반환하는 대신 배열에서 배열을 수정하십시오. np.choose도 작동하지만 "선택"배열 (조건 마스크 배열과 반대)을 만드는 것과 동일한 문제가 있습니다. 행동

는 :

In [66]: m1 = np.zeros((4, 9)) 

In [67]: np.where(np.all(np.indices(m1.shape) == np.array([2, 7])[:,None, None], 0), 43, m1) 
Out[67]: 
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 43., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) 

In [68]: np.where(np.all(np.rollaxis(np.indices(m1.shape),0,3) == np.array([2, 7]), -1), 43, m1) 
Out[68]: 
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 43., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) 
관련 문제