2014-09-04 3 views
3
import numpy as np 
bc = np.arange(10) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

# regular way using NumPy function 
np.diff(bc) # array([1, 1, 1, 1, 1, 1, 1, 1, 1]) 

# something similar with array subtraction: 
bc[1:] - bc[:-1] # array([1, 1, 1, 1, 1, 1, 1, 1, 1]) 

# but this does the wrong thing: 
bc[1:] -= bc[:-1] # array([0, 1, 1, 2, 2, 3, 3, 4, 4, 5]) 

는 C로 자체 사용하고 이런 일이 발생하는 이유 C++ 프로그래머가 내가 이해할 수있는 배열을 수정하지만, 파이썬의 최종 사용자처럼 보인다 때 NumPy는 이것을 기대하지 않을 수도 있습니다. 그리고 이것이 작동하지 않는다고 말하는 어떤 문서도 찾지 못했습니다.NumPy와 : 잘못된 결과 (다시 한번) 대신에 memmove를 (의) 그것의 방어 적이기()를

질문은 여기에 NumPy에 버그가 있습니까 (아마도 아님)입니까, 아니면 이와 같은 상황에 어떤 규칙이 있는지 설명하는 NumPy 설명서가 있습니까? 아니면 설명서에 빠져 있습니까?

두 번째로, 나는 시공간적으로 준 최적 인 안전한 작동 솔루션을 찾고 싶다. 즉, 일정량 이상으로 메모리를 할당해서는 안되며 어리석은 순수 파이썬 "for"루프가 아니어야합니다. :) 분명히 효과가없는 적절한 수정으로 달성하기를 희망하는 목표입니다.

NumPy 1.8.0을 사용하고 있습니다.

+0

는 내부적으로'diff'이 같은 슬라이스 차이를 사용 TNX의 EdChum

위에 당신이 정말로 원하는 것은 생각합니다. 슬라이스는 추가 메모리를 사용하지 않습니다. 유일한 추가 메모리 사용은 출력용입니다. 출력은 입력과 크기가 다르기 때문에 (특히 diff 단계가 1보다 큰 경우) 인플레 차이가 필요하지 않습니다. – hpaulj

+1

'np.subtract (bc [1 :], bc [: -1], out = bc [: -1])는 [[1,1,1,1,1,1,1,1,1,1, 9]'- 변경되지 않은 용어가 끝나는 것을 제외하고는 원하는 차이. – hpaulj

답변

0

이 질문을 게시 한 후 토론을 찾았습니다. 검색 할 중요한 용어는 "조각"입니다. 여기에 있습니다 : http://numpy-discussion.10968.n7.nabble.com/Strange-behavior-in-setting-masked-array-values-in-Numpy-1-1-0-td11999.html

페이지의 아래쪽에는이 종류의 것을 감지하고 경고하려고 시도하는 것에 대한 토론이 있지만 손실 된 원인처럼 들립니다. 그래서 나는 내가 원하는 것을하기위한 다른 적절한 방법을 찾는 것에 착수했다. 여기있어! 명시 적으로 NumPy와 효과적으로 수행 루프 "를"순수 파이썬을 작성하기위한 @fredtantini

bc[-1:0:-1] -= bc[-2::-1] 

신용. 저에게는 위의 해결책으로 이어진 순수한 파이썬에서 수정하는 방법에 대해 생각하게되었습니다 (뒤로 반복하십시오!).

+3

진지하게, 당신이 그런 종류의 위험한 트릭을하기 전에 새로운 배열을 반환하는 비 내장 버전은 배열을 할당하는 것이 그리 좋지 않고 더 나은 보행 방식이기 때문에 아마도 빠를 것입니다. – seberg

+0

나는이 방법이 위험하다고 생각하지 않는다. 너? 그렇다면 무엇이 잘못 될 수 있습니까? 어쨌든 새 배열을 할당하는 것은 저항이 가장 적은 일반적인 경로이지만 어레이의 크기가 기가 바이트 인 경우 실제 작동하지 않습니다. :) –

+0

numpy 개발자가 배열을 반복하는 방식을 변경하면 위험 할 수 있습니다. 예를 들어, 대부분의'memcpy' 구현은 "앞으로 복사"하지만 그것들이 필요하지는 않습니다. numpy 스펙이 반복 순서를 보장합니까? –

0

나는 버그라고 생각하지 않습니다.
Doing bc[1:] -= bc[:-1] 작업을 수행하는 동안 목록을 수정하려고합니다.

과정은 그래서 다음 단계 bc[i-1]가 수정

for i in range(1,len(bc)): 
    bc[i] = bc[i] - bc[i-1] 

같다 :

"i"  1 
bc[1:]: 1,2,3,4,5,… 
bc[:-1]: 0,1,2,3,4,5,… 
bc[1]= 1 - 0 = 1 
new bc: 0,1,2,3,4,5,… 

"i"  2 
bc[1:]: 1,2,3,4,5,… 
bc[:-1]: 0,1,2,3,4,5,… 
bc[2]= 2 - 1 = 1 
new bc: 0,1,1,3,4,5,… 


"i"   3 
bc[1:]: 1,1,3,4,5,… 
bc[:-1]: 0,1,1,3,4,5,… 
bc[1]= 3 - 1 = 2 
new bc: 0,1,1,2,4,5,… 


"i"   4 
bc[1:]: 1,1,2,4,5,… 
bc[:-1]: 0,1,1,2,4,5,… 
bc[1]= 4 - 2 = 2 
new bc: 0,1,1,2,2,5,… 

그리고 등등에.

나머지 질문에 대해서는 대답 할 수 없습니다.

+0

네, 이해합니다. 내 질문은 내 게시물의 하단에 명시되어 있습니다 ... 즉, 그것은 명백한 버그, 또는 어딘가에 문서화 여부, 그리고 버그가 아닌 경우, 거기에 준 최적의 같은 것을 안전한 처방이 있다면 공간과 시간. –

1

내 답변을 수정하려면 여기를 다시 게시하십시오. 아마 시도 :

bc-=np.roll(bc , 1) 

#array([-9, 1, 1, 1, 1, 1, 1, 1, 1, 1]) 
#this arrays length is 10 

#and then for an array with length 9 
bc=bc[ 1 : ] 

#array([1, 1, 1, 1, 1, 1, 1, 1, 1]) 

죄송 미스-이해하기 전에 질문,

결과에 대한 이유 :

'array([0, 1, 1, 2, 2, 3, 3, 4, 4, 5])' 

이 조치가 실제로 차감하는 형식으로 syntaxed 것을

입니다

let (say...) a=array([0,1,2,3,4,5,6,7,8,9]) 
updated a <- will be formed as [0, 1-0=1,2-1=1,3-1=2,4-2=2,5-2=3,6-3=3,7-3=4,8-4=4,9-4=5] 
,210

나는