Python TypeError:只有整数标量数组可以转换为标量索引
Posted
技术标签:
【中文标题】Python TypeError:只有整数标量数组可以转换为标量索引【英文标题】:Python TypeError : only integer scalar arrays can be converted to a scalar index 【发布时间】:2019-04-26 22:17:33 【问题描述】:我为这个问题制作了两个数组的更简单示例:labelArray
是一个一维数组,其索引处的标签对应于 nD 数组someValuesArray
的相同索引。我得到标签 2 出现的所有索引,并希望检索 someValuesArray
中的值。
labelArray = [2,0,1,2]
someValuesArray= [array([[ 2.15072 , 2.12438 , 2.27047 , 2.64567 ,
2.22976 , 2.18186 ]], dtype=float32),
array([ [ 2.29442, 2.3087 , 2.3111 , 2.1962 , 2.23694, 2.16988]], dtype=float32)),
array([[2.82851 , 2.73032 , 2.78301 , 1.71722 , 1.81542 , 1.78189 ]], dtype=float32)),
array([[ 1.19271, 1.14721, 1.27894 , 1.16637, 1.23343, 1.21666]], dtype=float32)]
所以如果我想要标签 2,我会得到索引 0 和 3,这应该会给出相应数组 someValuesArray
中索引 0 和 3 的值。
但是当我想调用我的函数时,我收到了一个 TypeError @array[indices]
。
TypeError: only integer scalar arrays can be converted to a scalar index
我的功能:
def searchValues(array, value):
labelArray = [2,0,1,2]
values_of_array = np.array(labelArray)
indices = np.where(values_of_array == value)[0]
return array[indices]
searchValues(someValuesArray,2)
【问题讨论】:
array[indices]
行的目的是什么?该表达式应该创建一个新数组,它是array
的子集。但是你不会对这个结果做任何事情。这不是就地操作。
但是至于错误,那个函数中的array
真的是numpy.ndarray
吗?我怀疑这是一个列表。
【参考方案1】:
如 cmets 中所述,someValuesArray
是二维 numpy 数组的列表。
我已将其转换为np.array
。
您问题中的代码示例尝试使用 numpy 数组索引 python 列表,这会导致您收到错误消息。
In [111]: a=np.array(someValuesArray) # Convert to a numpy array
In [112]: a
Out[112]:
array([[[ 2.15071988, 2.12438011, 2.2704699 , 2.64566994, 2.22975993, 2.18185997]],
[[ 2.29442 , 2.30870008, 2.31110001, 2.19619989, 2.23693991, 2.16987991]],
[[ 2.82851005, 2.73031998, 2.78301001, 1.71721995, 1.81542003, 1.78189003]],
[[ 1.19271004, 1.14721 , 1.27893996, 1.16637003, 1.23343003, 1.21666002]]], dtype=float32)
In [113]: def searchValues(array, value):
labelArray = [2,0,1,2]
values_of_array = np.array(labelArray)
indices = np.where(values_of_array == value)[0]
# print statements added to see what's happening
print("Indices: ", indices)
print("Array selection: \n", array[indices])
return array
searchValues(a,2)
[Out]
Indices: [0 3]
Array selection:
[[[ 2.15071988 2.12438011 2.2704699 2.64566994 2.22975993 2.18185997]] # a[0]
[[ 1.19271004 1.14721 1.27893996 1.16637003 1.23343003 1.21666002]]] # a[3]
Out[113]:
array(
[[[ 2.15071988, 2.12438011, 2.2704699 , 2.64566994, 2.22975993, 2.18185997]],
[[ 2.29442 , 2.30870008, 2.31110001, 2.19619989, 2.23693991, 2.16987991]],
[[ 2.82851005, 2.73031998, 2.78301001, 1.71721995, 1.81542003, 1.78189003]],
[[ 1.19271004, 1.14721 , 1.27893996, 1.16637003, 1.23343003, 1.21666002]]], dtype=float32)
indices = np.where(values_of_array == value)[0]
返回的两个索引都用于指向数组中的行。
你已经从函数返回了整个数组:你真的要返回array[indices]
吗?
【讨论】:
我编辑了我的评论,忘记编辑回报。我忘记将 someValuesArray 更改为 numpy 数组。现在它对我有用。谢谢。【参考方案2】:我可以通过以下方式重现您的错误消息:
标量数组的列表索引:
In [7]: [1,2,3,4][np.array(1)]
Out[7]: 2
具有 (1,) 形状数组的列表索引;一个元素但不是标量数组:
In [8]: [1,2,3,4][np.array([1])]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-8-4ad73b219fa3> in <module>()
----> 1 [1,2,3,4][np.array([1])]
TypeError: only integer scalar arrays can be converted to a scalar index
但是可以像这样索引一个数组:
In [9]: np.array([1,2,3,4])[np.array([1])]
Out[9]: array([2])
【讨论】:
以上是关于Python TypeError:只有整数标量数组可以转换为标量索引的主要内容,如果未能解决你的问题,请参考以下文章
numpy array TypeError:只有整数标量数组可以转换为标量索引
在 KNeighborsClassifier 中使用自定义指标时,我不断收到“TypeError:只有整数标量数组可以转换为标量索引”
线程 Thread-5 中的异常:TypeError:只能将整数标量数组转换为标量索引
将浮点数与数组中的值进行比较时,“TypeError:只能将整数标量数组转换为标量索引”
带有 TypeError 的 TensorRT 对象检测:只能将整数标量数组转换为标量索引
TypeError:只有整数、切片、省略号、tf.newaxis 和标量 tf.int32/tf.int64 张量是有效的索引