17

私はMacでpython2.7を実行しており、Ubuntuを使用している他の人とグループコーディングプロジェクトに取り組んでいます。時々、彼らが書いたコードは、キャストルールエラーのために私のコンピューターでは機能しません:

    273     # Apply column averages to image
--> 274     img[:middle] *= (bg[0]/np.tile(topCol, (middle,1)))
    275     img[middle:] *= bg[1]/np.tile(botCol, (middle,1))
    276 

TypeError: Cannot cast ufunc multiply output from dtype('float64') to dtype('int16') with casting rule 'same_kind'

これは、番号の種類が異なるいくつかの異なる場所で発生するため、詳細は必要ないと思います。

それは彼らのすべてのコンピュータで問題なく動作します。私が書いたものはすべて彼らのために機能しますが、彼らが書いたものは私にとってはうまくいかないことがよくあります。

私たちのマシンが同意しない理由はありますか、そして私が自分の側で物事を変えることができる方法はありますか?

ありがとう!

4

3 に答える 3

16

このスレッドnumpyは、あなたが同僚が使用しているバージョンよりも新しいことを示唆しています(を使用して確認してくださいnumpy.version.version)。1.7.0開発ブランチでは、暗黙のキャストルールをより厳密なsame_kindルールに変更したようです。これにより、浮動小数点形式と整数形式の間のキャストが(とりわけ)禁止されます。

これを回避するには、次のようなコードを使用することをお勧めします。

img[:middle] *= (bg[0]/np.tile(topCol, (middle,1))).astype(img.dtype)
于 2013-01-11T01:26:24.027 に答える
5

nneonneoには正しい解決策がありました。他に、いくつかの回避策を追加すると思いました。

1つの問題は、img変数が以前に手動でとして定義されていたことintです。float次に、違反した厳密な型キャストとの乗算

img = np.int16( cp.deepcopy(imgArray) )
...
img[:middle] *= bg[0]/np.tile(topCol, (middle,1))
>>TypeError: Cannot cast ufunc multiply output from dtype('float64') to dtype('int16') with casting rule 'same_kind'

1つの回避策:

後で必要になるものと一致するように、初期変数型の定義を変更できます。

img = np.float64( cp.deepcopy(imgArray) )
...
img[:middle] *= bg[0]/np.tile(topCol, (middle,1))

または、元の型キャストを保持して、演算子を変更することもできます。

img = np.int16( cp.deepcopy(imgArray) )
...
img[:middle] = img[:middle]*bg[0]/np.tile(topCol, (middle,1))

何らかの理由で、Numpyはこの方法で操作を許可しますが、*=

すべての助けをありがとう!

于 2013-01-11T20:20:22.670 に答える
2

numpyの開発者を引用するには(http://docs.scipy.org/doc/numpy-dev/release.html):

インプレース操作のデフォルトのキャストが「same_kind」に変更されました。たとえば、nが整数の配列で、fがfloatの配列である場合、n + = fはTypeErrorになりますが、以前のNumpyバージョンでは、floatはサイレントにintにキャストされていました。サンプルコードが実際のバグではないというまれなケースでは、np.add(n、f、out = n、casting ='unsafe')として書き換えることにより、下位互換性のある方法で更新できます。古い「安全でない」デフォルトは、Numpy1.7以降非推奨になっています。

したがって、インプレース乗算を維持する場合、コードは次のようになります。

np.multiply(img[:middle], (bg[0]/np.tile(topCol, (middle,1))), out=img[:middle], casting='unsafe')

于 2016-04-03T13:43:04.043 に答える