numpy array TypeError:只有整数标量数组可以转换为标量索引
Posted
技术标签:
【中文标题】numpy array TypeError:只有整数标量数组可以转换为标量索引【英文标题】:numpy array TypeError: only integer scalar arrays can be converted to a scalar index 【发布时间】:2018-04-04 18:28:00 【问题描述】:i=np.arange(1,4,dtype=np.int)
a=np.arange(9).reshape(3,3)
和
a
>>>array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
a[:,0:1]
>>>array([[0],
[3],
[6]])
a[:,0:2]
>>>array([[0, 1],
[3, 4],
[6, 7]])
a[:,0:3]
>>>array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
现在我想对数组进行矢量化以将它们一起打印。我试试
a[:,0:i]
或
a[:,0:i[:,None]]
它给出了TypeError:只有整数标量数组可以转换为标量索引
【问题讨论】:
【参考方案1】:尝试以下方法将您的数组更改为一维
a.reshape((1, -1))
【讨论】:
***.com/questions/48513824/… 我有类似的错误如何解决。【参考方案2】:简答:
[a[:,:j] for j in i]
您正在尝试做的是不是矢量化操作。 Wikipedia defines 向量化作为单个数组上的批处理操作,而不是单个标量:
在计算机科学中,数组编程语言(也称为向量或多维语言)对标量的运算进行泛化,以透明地应用于向量、矩阵和高维数组。
...
...对整个数组进行操作的操作可以称为矢量化操作...
在 CPU 级别的优化方面,definition of vectorization 是:
“向量化”(简化)是重写循环的过程,这样它不会处理数组的单个元素 N 次,而是同时处理(例如)数组的 4 个元素 N/4 次。
您的情况的问题是每个单独操作的结果具有不同的形状:(3, 1)
、(3, 2)
和 (3, 3)
。它们不能形成单个矢量化操作的输出,因为输出必须是一个连续的数组。当然,它可以在其中包含 (3, 1)
、(3, 2)
和 (3, 3)
数组(作为视图),但这就是您的原始数组 a
已经做的。
你真正要找的只是一个计算所有这些的表达式:
[a[:,:j] for j in i]
...但从性能优化的角度来看,它并没有矢量化。在引擎盖下,它是一个普通的 for
循环,它一个一个地计算每个项目。
【讨论】:
不能告诉你,我很感激,谢谢。节省了我的时间【参考方案3】:这可能与这个特定问题无关,但我遇到了一个类似的问题,我在 Python 列表上使用 NumPy 索引并得到了完全相同的错误消息:
# incorrect
weights = list(range(1, 129)) + list(range(128, 0, -1))
mapped_image = weights[image[:, :, band]] # image.shape = [800, 600, 3]
# TypeError: only integer scalar arrays can be converted to a scalar index
事实证明,我需要将一维 Python 列表 weights
转换为 NumPy 数组,然后才能应用多维 NumPy 索引。下面的代码有效:
# correct
weights = np.array(list(range(1, 129)) + list(range(128, 0, -1)))
mapped_image = weights[image[:, :, band]] # image.shape = [800, 600, 3]
【讨论】:
【参考方案4】:您可以使用 numpy.ravel 从 n 维数组中返回一个扁平数组:
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> a.ravel()
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
【讨论】:
【参考方案5】:我遇到了类似的问题并使用列表解决了它...不确定这是否有帮助
classes = list(unique_labels(y_true, y_pred))
【讨论】:
你是对的......不幸的是我不太确定它是如何解决的......我有一个工作示例,当我将示例的输出与我的代码进行比较时,我发现示例这一行中的代码正在生成一个项目列表......所以我想也让我的一个列表并修复它。谢谢。【参考方案6】:当我们使用向量代替标量时,就会出现这个问题 例如,在 for 循环中,范围应该是一个标量,以防你在那个地方给出了一个向量,你会得到错误。所以为了避免这个问题,请使用您使用过的向量的长度
【讨论】:
【参考方案7】:我在尝试使用 numpy.concatenate 来模拟 C++ 之类的 2D 向量后推时遇到了问题;如果 A 和 B 是两个 2D numpy.array,则 numpy.concatenate(A,B) 会产生错误。
解决方法是简单地添加 缺少的括号:numpy.concatenate( ( A,B ) ),这是必需的,因为要连接的数组构成一个单个参数
【讨论】:
以上是关于numpy array TypeError:只有整数标量数组可以转换为标量索引的主要内容,如果未能解决你的问题,请参考以下文章
opencv FisherFaceRecognizer 的 train() 函数显示 TypeError: src is not a numpy array, not a scalar
将 numpy 数组保存到 csv 会产生 TypeError Mismatch