を使用してscipy.ndimage.generic_filter
、配列のローカライズされたモーダル値を計算しています。2 つの方法を比較して、どちらが速いかを確認していました (最初の方法は非常に遅いため)。私の最初のアプローチは次のとおりです。
import numpy as np
import scipy.stats as stats
import scipy.ndimage
def modal(arr):
return stats.mode(arr, axis=None)[0][0]
x = np.random.randint(0, 100, size=(10, 10))
scipy.ndimage.filters.generic_filter(x, modal, size=3)
私の 2 番目のアプローチは次のとおりです。
def modal(arr):
return np.argmax(np.bincount(arr.flatten()))
x = np.random.randint(0, 100, size=(10, 10))
scipy.ndimage.filters.generic_filter(x, modal, size=3)
しかし、2番目のアプローチでは、次のようになります。
TypeError Traceback (most recent call last)
<ipython-input-122-2e9030c57d71> in <module>()
1 #%timeit -n 5 -r 1
----> 2 scipy.ndimage.filters.generic_filter(x, modal, size=3)
C:\Python27\ArcGIS10.2\lib\site-packages\scipy\ndimage\filters.pyc in generic_filter(input, function, size, footprint, output, mode, cval, origin, extra_arguments, extra_keywords)
1161 mode = _ni_support._extend_mode_to_code(mode)
1162 _nd_image.generic_filter(input, function, footprint, output, mode,
-> 1163 cval, origins, extra_arguments, extra_keywords)
1164 return return_value
<ipython-input-118-86ea9b03ed30> in modal(arr)
1 def modal(arr):
----> 2 return np.argmax(np.bincount(arr.flatten()))
3 return stats.mode(arr, axis=None)[0][0]
TypeError: array cannot be safely cast to required type
これを実行すると:
stats.mode(x, axis=None)[0][0] == np.argmax(np.bincount(x.flatten()))
戻るTrue
戻り値が同じ場合、メソッドではなくメソッドをgeneric_filter
使用すると型エラーがスローされるのはなぜですか?numpy.bincount
stats.mode
Windows 7でPython 2.7.3、Numpy 1.6.1、およびScipy 0.14.0を使用しています(これはESRI ArcGISに付属しているため、このバージョンのNumpyとPythonにこだわっています)。モーダルフィルターを計算するためにscikit-imageをインストールしようとしましたが、インストール時に他のエラーが発生し、これを解決する方が簡単だと思いました!