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

TypeError:使用 numpy 迭代 0-d 数组

将 numpy 数组保存到 csv 会产生 TypeError Mismatch

使 numpy 数组 JSON 可序列化

TypeError: 不支持的操作数类型 -: 'numpy.ndarray' 和 'numpy.ndarray'

python numpy错误“TypeError:'numpy.float64'对象不能解释为整数”