在运行单元测试以确认输出类型时,我收到一个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
谢谢!
答案 0 :(得分:4)
不是最好的解决方案,但您也可以将其转换为int
。
例如
average = counter / totalNumber
return int(average)
答案 1 :(得分:3)
如果您希望average
为整数,则应使用整数除法//
。
例如:
average = counter // totalNumber
在Python 2中,如果a / b
和a
都是整数,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)
这些结果仍为int32
或float64
。所以你仍然需要处理断言测试。它真的必须是int
吗?