微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将浮点数与数组中的值进行比较时,“类型错误:只有整数标量数组才能转换为标量索引”

如何解决将浮点数与数组中的值进行比较时,“类型错误:只有整数标量数组才能转换为标量索引”

当我尝试运行以下非最大值抑制函数时,我在将 -22.5 与 Gmat[i,j] 进行比较的行中收到错误

我使用 np.allnp.any 作为 andor 会给出一个错误,称为“ValueError:具有多个元素的数组的真值是不明确的。使用 a.any() 或 a.all()'

def non_max_suppression(Gmag,Gmat):
   nms_img = np.zeros(Gmag.shape)
   for i in range (1,int(Gmag.shape[0])-1):
       for j in range (1,int(Gmag.shape[1])-1):
           if np.any(
                   np.all(
                       Gmat[i,j] >=
                       -22.5,Gmat[i,j] <=
                       22.5),#doesnt go past here,this is where the error occurs
                   np.all(Gmat[i,j] <= -157.5,j] >= 157.5)
           ):
               if np.logical_and(Gmag[i,j] > Gmag[i,j+1],Gmag[i,j-1]):
                   nms_img[i,j] = Gmag[i,j]
               else:
                   nms_img[i,j] = 0

           if np.logical_or(
                   np.logical_and(Gmat[i,j] >= 22.5,j] <= 67.5),np.logical_and(Gmat[i,j] <= -112.5,j] >= -157.5)
           ):
               if np.logical_and(Gmag[i,j] > Gmag[i+1,j],j] > Gmag[i-1,j] >= 67.5,j] <= 112.5),j] <= -67.5,j] >= -112.5)
           ):
               if np.logical_and(Gmag[i,j]):
                   nms_img[i,j] >= 112.5,j] <= 157.5),j] <= -22.5,j] >= -67.5)
           ):
               if np.logical_and(Gmag[i,j+1]):
                   nms_img[i,j] = 0
   return nms_img

Gmag 和 Gmat 的值分别如下:

 Mag = {ndarray: (262,393,3)} [[[0. 0. 0.],[0. 0. 0.],...,[0. 0. 0.]],[[0. 0. 0.],[0. 0. 0.]]
 min = {float64} 0.0
 max = {float64} 1.7116336200484585
 shape = {tuple: 3} (262,3)
 dtype = {dtype: 0} float64
 size = {int} 308898
 array = {ndarrayItemsContainer} <pydevd_plugins.extensions.types.pydevd_plugin_numpy_types.ndarrayItemsContainer object at 0x00000275D41FAC08>

 Gmat = {ndarray: (262,[0. 0. 0.]]
 min = {float64} -135.0
 max = {float64} 45.0
 shape = {tuple: 3} (262,3)
 dtype = {dtype: 0} float64
 size = {int} 308898
 array = {ndarrayItemsContainer} <pydevd_plugins.extensions.types.pydevd_plugin_numpy_types.ndarrayItemsContainer object at 0x00000275D46BE048>

完整的错误

TypeError                                 Traceback (most recent call last)

<ipython-input-104-991cd7244b0e> in <module>
      1 #============================ 10 Apply Non-Maximum Suppression
----> 2 img_NMS = non_max_suppression(Mag,Gmat)
      3 img_NMS = normalize(img_NMS)
      4 
      5 plt.imshow(img_NMS,cmap = plt.get_cmap('gray'))

<ipython-input-103-2ec719b48bd0> in non_max_suppression(Gmag,Gmat)
      9                         -22.5,10                         Gmat[i,j] <=
---> 11                         22.5),12                     np.all(Gmat[i,j] >= 157.5)
     13             ):

<__array_function__ internals> in all(*args,**kwargs)

c:\users\user\appdata\local\programs\python\python37\lib\site-packages\numpy\core\fromnumeric.py in all(a,axis,out,keepdims)
   2409 
   2410     
-> 2411     return _wrapreduction(a,np.logical_and,'all',None,keepdims=keepdims)
   2412 
   2413 

c:\users\user\appdata\local\programs\python\python37\lib\site-packages\numpy\core\fromnumeric.py in _wrapreduction(obj,ufunc,method,dtype,**kwargs)
     85                 return reduction(axis=axis,out=out,**passkwargs)
     86 
---> 87     return ufunc.reduce(obj,**passkwargs)
     88 
     89 

TypeError: only integer scalar arrays can be converted to a scalar index

解决方法

Gmag 本来应该是一个 2d 数组,但它却是一个 3d 数组。

将 Gmag 转换为二维数组并使用 numpy.logical_andnumpy.logical_or 而不是 numpy.anynumpy.all 解决了问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。