2016-09-12 15 views
0

numpyを使ってイメージを操作する方法については、this tutorialに従っています。 scipyを使用してサンプル画像を読み込むと、最後にdtype値が追加されたRGBタプルの2D配列が取得されます。Numpy:ベクトル化された関数をdtypeの配列に適用する方法

array([[7, 8, 5], 
    [3, 5, 7]], dtype=uint8) 

は、私は、関数を書き、それを

def myfunc(a, b): 
    return a + 2 

vfunc = np.vectorize(myfunc) 

をベクトル化が、私は私の配列に適用する場合、結果は

array([[9, 10, 7], 
    [5, 7, 9]]) 

私の推測では、ということであるDTYPEを持っていないので、 "dtype + 2"は定義されていませんが、配列の要素を失うだけです。

ベクトル化してnumpy配列に適用すると、dtypeを削除しない関数を作成するにはどうすればよいですか?

答えて

0

dtype=uint8は配列の要素ではありません。配列がnp.uint8の型であることを知らせるために印刷されたものです。

デフォルトのタイプnp.float_np.int_は、そのような印刷結果を得ません。これは、2番目のケースで表示されているものです。 float配列とint配列を区別できる方法は、浮動小数点配列は常に数値に小数点を持ちます。

この理由は、アレイの各要素に2を追加しているためです。 2は整数なので、出力配列はnp.int_型に昇格され、明示的にdtypeの出力が得られません。

次の実験試すことができます:Pythonコードをベクトル化することは通常であることに注意してください、

最後
def myfunc(a, b): 
    return a + np.uint8(2) 

:配列要素に整数の代わりnp.uint8を追加し、結果を印刷しようとするmyfuncを再定義します物事を終わらせる最善の方法ではありません。関数自体はPythonの関数となるため、遅くなります。通常、numpyの機能で何らかの操作を実行する方法を見つける方が良いです。

1

np.vectorizeは、otypesのパラメータをとります。これを使ってリターンのdtypeを指定することができます。それがなければ、vectorizeはあなたの配列の最初の要素について試算を行い、その戻り値dtypeを使って応答全体のdtypeを決定します。

ドキュメントの3番目の例を見てください。

通常、最初の値が整数値(例:0)を生成し、全体が浮動すると予想される場合、ユーザーはこれに遭遇します。

ので、試してみてください。

​​
+0

ニースあなたがotypes' '言及しています。 –

関連する問題