首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy.ndimage.generic_filter返回类型错误

scipy.ndimage.generic_filter返回类型错误
EN

Stack Overflow用户
提问于 2014-12-03 00:35:24
回答 1查看 704关注 0票数 0

我使用scipy.ndimage.generic_filter来计算数组的局部模态值。我比较了两种方法,看哪种方法更快(因为第一种方法非常慢)。我的第一个方法是;

代码语言:javascript
复制
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)

我的第二个方法是;

代码语言:javascript
复制
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)

但第二种方法是这样的:

代码语言:javascript
复制
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

当我运行这个:

代码语言:javascript
复制
stats.mode(x, axis=None)[0][0] == np.argmax(np.bincount(x.flatten()))

它返回True

当返回的值相同时,为什么generic_filter在使用numpy.bincount方法而不是stats.mode方法时抛出类型错误?

我在Windows 7上使用Python2.7.3、Numpy 1.6.1和Scipy0.14.0(我坚持使用这个版本的Numpy和Python,因为这是ESRI ArcGIS附带的内容)。我试着安装scikit映像来计算模态过滤器,但是在安装上我得到了其他错误,并且认为解决这个错误更简单!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-03 00:53:20

可以通过在modal中放置打印语句来调查此错误。

代码语言:javascript
复制
def modal(arr):
    print(arr)
    return np.argmax(np.bincount(arr.flatten()))

你会看到输出就像

代码语言:javascript
复制
[ 92.  92.  31.  92.  92.  31.  87.  87.  18.]

这表明arr包含的是浮点数,而不是整数。np.bincount的文档声明它的第一个参数必须是一个非负ints的一维数组。

因此,您可以通过使用astype('int64')将浮点数转换为ints来避免错误。

代码语言:javascript
复制
import numpy as np
import scipy.stats as stats
import scipy.ndimage

def modal(arr):
    return stats.mode(arr, axis=None)[0][0]

def modal2(arr):
    count = np.bincount(arr.astype('int64'))
    return np.argmax(count)

x = np.random.randint(0, 100, size=(10, 10))

out = np.empty_like(x, dtype='float')
scipy.ndimage.filters.generic_filter(x, modal, size=3, output=out)
print(out)

scipy.ndimage.filters.generic_filter(x, modal2, size=3, output=out)
print(out)

PS。可以删除对flatten的调用,因为arr已经是一维的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27261662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档