2017-03-13 1 views
1

나는 모양 (N, 3)을 가진 float의 ndarray 'n_data'를가집니다. 반복하고 'n_data'(사본이 아님)을 변경하려고합니다. 다음 코드 마녀가 작동해야하지만 아주 더러운 느낌 :올바른 파이썬 방법 : for 루프에서 원래 작업

i = 0 
    for point in n_data: 
     point -= center 

     r = np.linalg.norm(point) 
     n_data[i] = point * (r ** gamma/r) 

     i += 1 

I 위와 np.nditer를 사용하지만, 각 반복 것이 하나의 숫자와 모양 (3)와이 아닌 ndarray을 얻을 것 시도 .

 for point in np.nditer(n_data, op_flags=['readwrite']): 

     point -= center 

     r = np.linalg.norm(point) 
     point = point * (r ** gamma/r) 

미리 도움 주셔서 감사합니다.

+0

'nditer'는 일반적으로 파이썬보다'c' 코드에서 더 좋습니다. 행을 반복해야하고 인덱스가 필요한 경우'for i, 행을 열거 (arr) : '라고 사용합니다. – hpaulj

답변

1

NumPy와 약관 여전히과로 번역 한 벡터화 버전과 같이, NumPy broadcasting을 활용하고 np.linalg.norm와 선택적 인수 axis 매개 변수를 사용하여 것이 원래 코드에 충분히 가까이 보면 -

shifted = n_data - center 
R = np.linalg.norm(shifted, axis=1, keepdims=1) 
n_data = shifted * (R ** gamma/R) 

희망이 덜 더러운!

+0

제안을 테스트 한 결과 완벽하게 작동합니다. 좋은 답변 주셔서 감사합니다, 나는 방송을 줄 것이다 ;-) – Jake

관련 문제