【问题标题】:numpy array TypeError: only integer scalar arrays can be converted to a scalar indexnumpy array TypeError:只有整数标量数组可以转换为标量索引
【发布时间】: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:只有整数标量数组可以转换为标量索引

【问题讨论】:

    标签: python numpy indexing vectorization


    【解决方案1】:

    尝试以下方法将您的数组更改为一维

    a.reshape((1, -1))
    

    【讨论】:

    【解决方案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 ) ),这是必需的,因为要连接的数组构成一个单个参数

          【讨论】:

            猜你喜欢
            • 2021-10-31
            • 2021-07-15
            • 2018-12-02
            • 2021-01-27
            • 2019-04-26
            • 2017-12-15
            • 1970-01-01
            • 2022-01-03
            相关资源
            最近更新 更多