Numpy 数组 TypeError: 只有整数标量数组可以转换为标量索引

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: 只有整数标量数组可以转换为标量索引

400921 次浏览

尝试将数组更改为1D

a.reshape((1, -1))

简短的回答:

[a[:,:j] for j in i]

你要做的是 不是可向量化的操作维基百科定义向量化作为单个数组上的批处理操作,而不是单个标量上的批处理操作:

在计算机科学中,阵列编程语言(也称为向量或多维语言)将标量上的操作推广到向量、矩阵和高维数组上。

...

操作整个数组的操作可以称为 矢量化操作。

在 CPU 级优化方面,矢量化的定义矢量化的定义是:

“向量化”(简化)是重写一个循环的过程,这样它不再处理数组中的单个元素 N 次,而是同时处理数组中的4个元素 N/4次。

这种情况的问题在于,每个操作的结果都有一个 不同的形状: (3, 1)(3, 2)(3, 3)。它们不能形成单个向量化操作的输出,因为输出必须是一个连续的数组。当然,它可以在其中包含 (3, 1)(3, 2)(3, 3)数组(作为视图) ,但是原始数组 a已经这样做了。

你真正要找的只是一个计算所有这些的表达式:

[a[:,:j] for j in i]

... 但是它并没有向量化,在性能优化的意义上。在引擎盖下面是一个简单的旧 for循环,它逐个计算每个项目。

这可能与这个特定的问题无关,但是我遇到了类似的问题,在 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

事实证明,在应用多维 NumPy 索引之前,我需要将1D Python 列表 weights转换为 NumPy 数组。以下守则适用于:

# correct
weights = np.array(list(range(1, 129)) + list(range(128, 0, -1)))
mapped_image = weights[image[:, :, band]] # image.shape = [800, 600, 3]

可以使用 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])

我有一个类似的问题,并解决了它使用清单... 不知道这是否会有帮助或没有

classes = list(unique_labels(y_true, y_pred))

当我们用向量代替标量时,这个问题就出现了 例如,在 for 循环中,范围应该是一个标量,以防在给定向量的位置出现错误。因此,为了避免这个问题,使用您使用的向量的长度

当我冒险使用 numpy.concatenate 来模拟 C + + 时遇到了这个问题,就像2D 向量的回推一样; 如果 A 和 B 是两个2D numpy.array,那么 numpy.concatenate (A,B)会产生错误。

补丁只是简单地添加了 缺少括号: numpy.concatenate (( A,B )) ,这是必需的,因为要连接的数组构成了一个 单身参数