繁体   English   中英

Python函数未按预期返回类型

[英]Python function not returning type as expected

在运行单元测试以确认输出类型时,我得到一个AssertionError:!=在此函数上键入'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

谢谢!

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

例如

average = counter / totalNumber

return int(average)

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

例如:

average = counter // totalNumber


在Python 2中,如果ab均为整数,则a / b将给出整数结果。 但是在Python 3中, a / b始终会导致浮动。

FWIW,在Python 2中,您可以通过以下方式获得/行为Python 3的方式

from __future__ import division

在脚本的开头。

请参阅在Python中,用于除法的'/'和'//'之间有什么区别?

看看是否要从__future__导入分区。

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

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

在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数字在一个int周围有一个numpy包装器。 通常这不是问题,但是要满足测试的要求,您需要测试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吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM