Python函数没有按预期返回类型

时间:2015-08-28 08:18:16

标签: python opencv numpy

在运行单元测试以确认输出类型时,我收到一个AssertionError:!= type' int'关于这个功能,无法弄清楚原因。

    def averagePix(image):
        totalNumber = image.size
        counter = 0

        it = np.nditer(image)
        for (m) in it:
            counter = counter + m

        average = counter / totalNumber
        return average

我需要返回一个int类型。如果我注释掉np.nditer块,它会传递类型为int的测试。有人可以帮我弄清楚这个块是如何搞砸的吗?

        it = np.nditer(image)
        for (m) in it:
            counter = counter + m

谢谢!

4 个答案:

答案 0 :(得分:4)

不是最好的解决方案,但您也可以将其转换为int

例如

average = counter / totalNumber

return int(average)

答案 1 :(得分:3)

如果您希望average为整数,则应使用整数除法//

例如:

average = counter // totalNumber


在Python 2中,如果a / ba都是整数,b将给出整数结果。但是在Python 3中a / b将始终导致浮动。

FWIW,在Python 2中,你可以通过放置

/表现出Python 3的方式
from __future__ import division

在脚本开头。

请参阅In Python, what is the difference between '/' and '//' when used for division?

答案 2 :(得分:2)

看看你是否在某个时候从__future__导入部门。

另外,看看image.size是不是浮动的。

另外,直接使用numpy进行平均。 :P

答案 3 :(得分:1)

在IPython3会话中,我使用以下代码重现您的代码:

In [228]: image=np.ones((4,4),dtype=int)
In [230]: counter=0
In [231]: it=np.nditer(image)
In [232]: for (m) in it:
   .....:     counter = counter + m

In [233]: counter
Out[233]: 16

In [234]: type(counter)
Out[234]: numpy.int32

In [235]: average = counter/image.size
In [236]: type(average)
Out[236]: numpy.float64

In [237]: average = counter//image.size # force integer division
In [238]: type(average)
Out[238]: numpy.int32

这两个average值都将无法通过type()==int测试。 numpy.int32号码在numpy周围有一个int包装。通常这不是问题,但为了满足测试,您需要测试average.item() - 将其从包装中取出。

nditer实际上正在为您的counter添加一个数组

In [240]: type(m)
Out[240]: numpy.ndarray
In [241]: m
Out[241]: array(1)

您可以将item应用于m

来解决这个问题
for (m) in it:
    counter = counter + m.item()

您为什么使用nditer?要学习如何使用它?这不是最好的应用程序。替代方案包括

counter = np.sum(image)
counter = np.sum.flat(image)
average = np.average(image)

这些结果仍为int32float64。所以你仍然需要处理断言测试。它真的必须是int吗?