2009-08-27 7 views
0

당신은 하단 라인에 건너 뛸 수 있습니다어떻게 뺄셈을 파이썬에서 서명 할 수 있습니까?</p> <p>을 나는 파이썬에 다음 코드를 가지고 : 당신이 배경에 대해 상관하지 않는 경우

나에게 잘못된 값을주고있다
ratio = (point.threshold - self.points[0].value)/(self.points[1].value - self.points[0].value) 

. 예를 들어, 위해 :

threshold: 25.0 
self.points[0].value: 46 
self.points[1].value: 21 

내가 가지고 : 잘못

ratio: -0.000320556853048 

합니다.

21 - 46 = 65511 

내가 point.threshold의 유형을 정의 적이 있지만 :

그것으로 보면, 나는 self.points[0].valueself.points[1].value] are of the type numpy.uint16`, 그래서 내가 가진 것을 깨달았다. 방금 배정 했어. 평범한 바닐라가 있다고 상상해보십시오 int.

가 어떻게 두 uint의의 뺄셈을 강제 할 수있는 결론은

을 서명하는?

ratio = (float(point.threshold) - float(self.points[0].value))/(float(self.points[1].value) - float(self.points[0].value)) 

아니면 당신이 NumPy와 서명 유형 중 하나에 캐스팅 수도있을 것 같군요 :

답변

2

거의 모든 것 그러나 단위가 여기에서 작동하므로, 빼기를 수행하기 전에 이들을 다른 것으로 캐스팅하십시오.

임계 값 = 25.0 (소수점 참고)이기 때문에 float이므로 뺄셈과 나누기는 사용자가 uint를 사용하지 않는 한 모두 작동합니다.

2

음, 확실한 해결책은 아마도 수레로 캐스팅하는 것입니다.

0

실제로 이러한 값은 int16 대신 uint16이되어야합니까? 2**15 이상의 값을 가져야 만하지 않는 한 (그러나 여전히 2**16 아래) 값을 가져올 수 없으면 int16으로 유지하고 완료 할 수 있습니다. 발견 한대로 부호없는 int는 까다 롭습니다. -). uint16이 필요하다면 David이 제안한대로 캐스트합니다.하지만 int16을 사용하면 간단하고 빠르게 읽을 수 있습니다.

사실, 그것은 point.threshold가 float이고 int가 아닌 것입니다 (좋은 점도 있습니다. 그렇지 않으면 해당 구분이 코드화 된 방식이 될 것입니다. 장래의 실제 부문을 가져 오지 않는 한, 파이썬의 많은 2.* 릴리스에서 지원되었으며, 결국 3.*에서 작동합니다. .025.0은 "그것을 버려서"보여 주며 int가 아닌 float입니다.

+0

데이터가 uint16 형식 인 이진 파일에서 데이터를 읽습니다. 나는 미래로부터 진정한 분열을 수입했다. –

+0

그러나 그들은 서명되지 않아야한다. 즉, 그들은 실제로 '2 ** 15'와 '2 ** 16'사이의 값을 취하는가? 그렇지 않으면 부호없는 대수와 부호있는 정수의 이진 형식간에 차이가 없습니다. –