0

を使用して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.bincountstats.mode

Windows 7でPython 2.7.3、Numpy 1.6.1、およびScipy 0.14.0を使用しています(これはESRI ArcGISに付属しているため、このバージョンのNumpyとPythonにこだわっています)。モーダルフィルターを計算するためにscikit-imageをインストールしようとしましたが、インストール時に他のエラーが発生し、これを解決する方が簡単だと思いました!

4

1 に答える 1