[英]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中,如果a
和b
均为整数,则a / b
将给出整数结果。 但是在Python 3中, a / b
始终会导致浮动。
FWIW,在Python 2中,您可以通过以下方式获得/
行为Python 3的方式
from __future__ import division
在脚本的开头。
看看是否要从__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)
这些结果将仍然是int32
或float64
。 因此,您仍然必须处理断言测试。 真的必须是int
吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.