2009-08-27 35 views
0

您可以跳過底線,如果你不關心背景:如何強制減法在Python中籤名?

我在Python下面的代碼:

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 

哪項是錯誤的。

尋找到它,我意識到self.points[0].valueself.points[1].value] are of the type numpy.uint16`,所以我就:

21 - 46 = 65511 

雖然我從來沒有爲point.threshold定義的類型。我剛分配它。我想它有一個普通的香草int

底線

我怎麼能強迫兩個uint S中的減法要簽名?

回答

2

幾乎所有的東西 uints將在這裏工作,所以只需在做減法操作之前將它們轉換爲其他東西。因爲threshold = 25.0(注意小數點),所以它是一個浮點數,所以只要不使用uint,減法和除法都將工作。

2

那麼,顯而易見的解決方案很可能會投給花車:

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

或者,我想你可以強制轉換爲numpy的符號類型之一。

0

這些值實際上需要是uint16而不是int16嗎?除非他們必須能夠獲得2**15或更高的值(但仍然低於2**16),否則您可以簡單地將它們保留爲int16並完成它 - 正如您發現的,未簽名的整數可能會非常棘手(而不僅僅是numpy; - )。如果你需要uint16,然後按照David的建議工作,但如果你可以簡單地使用int16,它會更快,更具可讀性。

順便說一句,它看起來像那個point.threshold是一個浮點數,而不是一個整數(也是好事,否則除非你從未來導入真正的分割,否則這種分割方式對你的代碼將是截斷的,正如許多2.*版本的Python所支持的那樣 - 並且最終在3.*中工作。 「」中的.0「給出了它」並顯示它是一個浮點數,而不是整數。

+0

我正在讀取數據是uint16格式的二進制文件中的數據。我也從未來導入了真正的分區 – 2009-08-27 18:48:14

+0

但是他們是否需要無符號的,即他們實際上是否在'2 ** 15'和'2 ** 16'之間取值?否則,無符號與有符號整數的二進制格式沒有區別。 – 2009-08-28 05:23:38

相關問題