함수 호출 f(m1)
여기서 m1
은 numpy 행렬입니다. 지금, 나는 m1
거의 동일 행렬에 f
를 호출하고 싶습니다 : 그 작업을 수행하는 우아한 f(...)
한 줄이numpy 행렬의 단일 요소를 업데이트하는 Python 방법?
m2 = m1.copy()
m2[ 2, 7 ] = 43 # or m2[ 2, 7 ] += 43
f(m2)
있습니까? 당신이 할 수 있도록
함수 호출 f(m1)
여기서 m1
은 numpy 행렬입니다. 지금, 나는 m1
거의 동일 행렬에 f
를 호출하고 싶습니다 : 그 작업을 수행하는 우아한 f(...)
한 줄이numpy 행렬의 단일 요소를 업데이트하는 Python 방법?
m2 = m1.copy()
m2[ 2, 7 ] = 43 # or m2[ 2, 7 ] += 43
f(m2)
있습니까? 당신이 할 수 있도록
파이썬에서 모든 임무는 성명 아닌 표현이다 -
f(m2[2,7] = 43)
또는
if (a = 1+2)
을 나는 당신이 할 수 있다고 생각
f(modify_matrix(m1))
m1 행렬을 수정하기위한 별도의 메소드를 정의한다.
def modify_matrix(m1):
m1[2,7] = 2
return m1
위의 옵션은 행렬을 수정하는 데 한 줄 더 더 추가하면됩니다.
교육학적인 측면에서 볼 때 다음과 같은 기능적 방법이 있습니다. np.where
실제로 당신이 원하는 것을 정확히 않지만, 까다로운 부분은 아닌 인덱스 부울 조건을 받아들이는 것입니다 : condition
이 충족되는 곳, 다른 곳에서 그냥 m1
를 전송 43
f
에 전송
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.]])
이 바로 그것을 할 수있는 방법입니다. 그러나 코드가 같은 시간에'm1'과'm2'를 생성 할 수있는 방식으로 구성되어 있다면,보다 우아하고 효율적인 방법이있을 수 있습니다. – shx2