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

Posted

技术标签:

【中文标题】将浮点数与数组中的值进行比较时,“TypeError:只能将整数标量数组转换为标量索引”【英文标题】:“TypeError: only integer scalar arrays can be converted to a scalar index” when comparing a float with the value from an array 【发布时间】:2021-02-19 05:31:59 【问题描述】:

当我尝试运行以下非最大抑制函数时,在将 -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, Gmat[i,j] >= 157.5)
           ):
               if np.logical_and(Gmag[i,j] > Gmag[i,j+1] , Gmag[i,j] > 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 , Gmat[i,j] <= 67.5) ,
                   np.logical_and(Gmat[i,j] <= -112.5 , Gmat[i,j] >= -157.5)
           ):
               if np.logical_and(Gmag[i,j] > Gmag[i+1,j] , Gmag[i,j] > Gmag[i-1,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] >= 67.5 , Gmat[i,j] <= 112.5) ,
                   np.logical_and(Gmat[i,j] <= -67.5 , Gmat[i,j] >= -112.5)
           ):
               if np.logical_and(Gmag[i,j] > Gmag[i+1,j] , Gmag[i,j] > Gmag[i-1,j]):
                   nms_img[i,j] = Gmag[i,j]
               else:
                   nms_img[i,j] = 0

           if np.logical_or(
                   np.logical_and(Gmat[i,j] >= 112.5 , Gmat[i,j] <= 157.5) ,
                   np.logical_and(Gmat[i,j] <= -22.5 , Gmat[i,j] >= -67.5)
           ):
               if np.logical_and(Gmag[i,j] > Gmag[i,j+1] , Gmag[i,j] > Gmag[i-1,j+1]):
                   nms_img[i,j] = Gmag[i,j]
               else:
                   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.],  [0. 0. 0.]],, [[0. 0. 0.],  [0. 0. 0.],  [0. 0. 0.],  ...,  [0. 0. 0.],  [0. 0. 0.],  [0. 0. 0.]],, [[0. 0. 0.],  [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, 393, 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, 393, 3) [[[0. 0. 0.],  [0. 0. 0.],  [0. 0. 0.],  ...,  [0. 0. 0.],  [0. 0. 0.],  [0. 0. 0.]],, [[0. 0. 0.],  [0. 0. 0.],  [0. 0. 0.],  ...,  [0. 0. 0.],  [0. 0. 0.],  [0. 0. 0.]],, [[0. 0. 0.],  [0. 0. 0.],  [0. 0. 0.],  ...,  [0. 0. 0.],  [0. 0. 0.],  [0. 0. 0.]]
 min = float64 -135.0
 max = float64 45.0
 shape = tuple: 3 (262, 393, 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, 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', axis, None, out, keepdims=keepdims)
   2412 
   2413 

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

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

【问题讨论】:

【参考方案1】:

Gmag 应该是 2d 数组时是 3d 数组。

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

【讨论】:

以上是关于将浮点数与数组中的值进行比较时,“TypeError:只能将整数标量数组转换为标量索引”的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数写入数组需要太多时间

将浮点数转换为PHP中的字节数组

如何将浮点数转换为长度为 4 的字节数组(char* 数组)?

将浮点数转换为十进制,错误的值

将浮点数转换为无符号短时的舍入问题

从文件中读取浮点数/单词/符号并仅将浮点数存储在数组 C++ 中