numpy数组类型错误:只有整数标量数组可以转换为标量索引

n1bvdmb6  于 2023-01-26  发布在  其他
关注(0)|答案(8)|浏览(95)
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]]

它给出类型错误:只有整数标量数组可以转换为标量索引

ryevplcw

ryevplcw1#

简短回答:

[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循环,一个接一个地计算每一项。

8iwquhpp

8iwquhpp2#

我在冒险使用numpy.concatenate来模拟一个类似于C++的二维向量回推时遇到了这个问题;如果A和B是两个二维numpy.数组,则numpy.concatenate(A,B)会产生错误。
修复方法是简单地添加缺少的方括号:numpy.concatenate(A,B),这是必需的,因为要连接的数组构成一个 * 单个 * 参数

8gsdolmq

8gsdolmq3#

这可能与这个特定的问题无关,但我遇到了一个类似的问题,我在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索引之前,我需要将weights(一个1D 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]
svdrlsy4

svdrlsy44#

尝试以下操作将数组更改为1D

a.reshape((1, -1))
0ejtzxu1

0ejtzxu15#

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

ycggw6v26#

我有一个类似的问题,并解决了它使用列表...不确定这是否会有帮助或没有

classes = list(unique_labels(y_true, y_pred))
vxf3dgd4

vxf3dgd47#

当我们用向量代替标量时,这个问题就出现了,例如在for循环中,取值范围应该是标量,如果你在那个地方给了一个向量,你会得到错误,所以为了避免这个问题,使用你所用向量的长度

yjghlzjz

yjghlzjz8#

我遇到这个错误时,试图访问列表元素使用一维数组.我建议这个页面,但我不知道我在寻找答案.
l为列表,myarray为我的一维数组,使用myarray的元素访问列表l的正确方法是
np.take(l,myarray)

相关问题