“TypeError: only integer scalar arrays can be converted to a scalar index” when comparing a float with the value from an array
“TypeError: only integer scalar arrays can be converted to a scalar index” when comparing a float with the value from an array
当我尝试 运行 以下非最大抑制函数时,在将 -22.5 与 Gmat[i,j]
进行比较的行出现错误:
我使用 np.all
和 np.any
因为 and
和 or
会给出一个名为 'ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or 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
Gmag
本来应该是二维数组,却变成了三维数组。
将 Gmag 转换为二维数组并使用 numpy.logical_and
和 numpy.logical_or
而不是 numpy.any
和 numpy.all
解决了问题。
当我尝试 运行 以下非最大抑制函数时,在将 -22.5 与 Gmat[i,j]
进行比较的行出现错误:
我使用 np.all
和 np.any
因为 and
和 or
会给出一个名为 'ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or 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
Gmag
本来应该是二维数组,却变成了三维数组。
将 Gmag 转换为二维数组并使用 numpy.logical_and
和 numpy.logical_or
而不是 numpy.any
和 numpy.all
解决了问题。