numpy数组TypeError:只能将整数标量数组转换为标量索引

kin*_*hen 46 python indexing numpy vectorization

i=np.arange(1,4,dtype=np.int)
a=np.arange(9).reshape(3,3)
Run Code Online (Sandbox Code Playgroud)

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]])
Run Code Online (Sandbox Code Playgroud)

现在我想对数组进行矢量化以将它们一起打印出来.我试试

a[:,0:i]
Run Code Online (Sandbox Code Playgroud)

要么

a[:,0:i[:,None]]
Run Code Online (Sandbox Code Playgroud)

它给出了TypeError:只有整数标量数组可以转换为标量索引

use*_*818 23

我在冒险使用 numpy.concatenate 来模拟 C++ 时遇到了这个问题,比如 2D 向量的推回;如果 A 和 B 是两个 2D numpy.arrays,则 numpy.concatenate(A,B) 会产生错误。

解决方法是简单地添加缺少的括号: numpy.concatenate( ( A,B ) ),这是必需的,因为要连接的数组构成单个参数


Max*_*xim 21

简短回答:

[a[:,:j] for j in i]
Run Code Online (Sandbox Code Playgroud)

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

在计算机科学中,阵列编程语言(也称为向量或多维语言)概括了对标量的操作,以透明地应用于向量,矩阵和更高维数组.

...

...对整个数组进行操作的操作可称为矢量化操作...

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

"矢量化"(简化)是重写循环的过程,因此它不是处理数组的单个元素N次,而是同时处理(比如说)阵列的4个元素N/4次.

与你的情况的问题是,每个人操作的结果有不同的形状:(3, 1),(3, 2)(3, 3).它们不能形成单个矢量化操作的输出,因为输出必须是一个连续的数组.当然,它可以包含(3, 1),(3, 2)并在其中包含(3, 3)数组(作为视图),但这就是原始数组a已经完成的工作.

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

[a[:,:j] for j in i]
Run Code Online (Sandbox Code Playgroud)

...但它在性能优化方面没有矢量化.在引擎盖下,它是一个普通的旧for循环,逐个计算每个项目.


小智 10

尝试以下操作将阵列更改为1D

a.reshape((1, -1))
Run Code Online (Sandbox Code Playgroud)


Zha*_*hen 8

这可能与这个特定问题无关,但是我遇到了一个类似的问题,其中我在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
Run Code Online (Sandbox Code Playgroud)

事实证明weights,在应用多维NumPy索引之前,我需要将一维Python列表转换为NumPy数组。以下代码有效:

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


And*_*ujo 5

您可以使用 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])
Run Code Online (Sandbox Code Playgroud)


Cha*_*uad 5

我遇到了类似的问题并使用列表解决了它...不确定这是否有帮助

classes = list(unique_labels(y_true, y_pred))
Run Code Online (Sandbox Code Playgroud)