【问题标题】:Add single element to array in numpy在numpy中将单个元素添加到数组
【发布时间】:2011-11-12 01:38:17
【问题描述】:

我有一个 numpy 数组,其中包含:

[1, 2, 3]

我想创建一个数组,其中包含:

[1, 2, 3, 1]

也就是说,我想将第一个元素添加到数组的末尾。

我已经尝试了明显的:

np.concatenate((a, a[0]))

但我收到一条错误消息,提示 ValueError: arrays must have same number of dimensions

我不明白 - 数组都只是一维数组。

【问题讨论】:

  • np.insert([1,2,3], 3, 1)

标签: python arrays numpy


【解决方案1】:

a[0] 不是数组,它是a 的第一个元素,因此没有维度。

尝试改用a[0:1],这将返回单个项目数组中a 的第一个元素。

【讨论】:

    【解决方案2】:

    试试这个:

    np.concatenate((a, np.array([a[0]])))
    

    http://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html

    concatenate 需要两个元素都是 numpy 数组;但是, a[0] 不是数组。这就是它不起作用的原因。

    【讨论】:

    • 或者,更简单的np.concatenate((a, [a[0]]))。无论如何,列表都会自动升级为数组类型,从而节省您的输入时间。
    【解决方案3】:

    append() 创建一个新数组,该数组可以是带有附加元素的旧数组。

    我认为使用正确的方法添加元素更正常:

    a = numpy.append(a, a[0])
    

    【讨论】:

    • 此命令不会改变a 数组。但是,它返回一个新的修改数组。因此,如果需要修改a,则必须使用a = numpy.append(a,a[0])
    • np.append 使用np.concatenate。它只是确保插件具有一维。 OP 错误是 a[0] 有 0 个维度。
    • 如果我只想添加一个元素,为什么 append 会创建一个全新的数组?
    • 我不喜欢这样一个简单的命令需要调用另一个函数的事实。如果数组本身有一个内部方法会更好,比如a.append(1)a.add(1),或者甚至类似于a + [1]这样的列表
    【解决方案4】:
    t = np.array([2, 3])
    t = np.append(t, [4])
    

    【讨论】:

      【解决方案5】:

      这可能有点矫枉过正,但我​​总是将np.take 函数用于任何环绕索引:

      >>> a = np.array([1, 2, 3])
      >>> np.take(a, range(0, len(a)+1), mode='wrap')
      array([1, 2, 3, 1])
      
      >>> np.take(a, range(-1, len(a)+1), mode='wrap')
      array([3, 1, 2, 3, 1])
      

      【讨论】:

        【解决方案6】:

        假设a=[1,2,3],您希望它是[1,2,3,1]

        您可以使用内置的追加功能

        np.append(a,1)
        

        这里的 1 是一个 int,它可能是一个字符串,它可能属于也可能不属于数组中的元素。打印:[1,2,3,1]

        【讨论】:

        • 欢迎来到 StackOverflow!您可能想阅读 this guide 以了解如何格式化代码,然后更新您的答案以使其更具可读性:) 这也是一个非常古老的问题,答案已被接受,最好回答一些新问题
        【解决方案7】:

        这个命令,

        numpy.append(a, a[0])
        

        不改变a 数组。但是,它返回一个新的修改数组。 所以,如果需要修改a,那么就必须使用下面的。

        a = numpy.append(a, a[0])
        

        【讨论】:

          【解决方案8】:

          当只添加一次或一次又一次时,在您的数组上使用np.append 应该没问题。这种方法的缺点是每次调用时都会为一个全新的数组分配内存。当为大量样本增长数组时,最好预先分配数组(如果总大小已知)或附加到列表并随后转换为数组。

          使用np.append

          b = np.array([0])
          for k in range(int(10e4)):
              b = np.append(b, k)
          1.2 s ± 16.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
          

          之后使用python列表转换为数组:

          d = [0]
          for k in range(int(10e4)):
              d.append(k)
          f = np.array(d)
          13.5 ms ± 277 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
          

          预分配numpy数组:

          e = np.zeros((n,))
          for k in range(n):
              e[k] = k
          9.92 ms ± 752 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
          

          当最终大小未知时,预分配很困难,我尝试以 50 个块为单位进行预分配,但与使用列表相差无几。

          85.1 ms ± 561 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
          

          【讨论】:

            【解决方案9】:

            如果要添加元素,请使用append()

            a = numpy.append(a, 1) 在这种情况下在数组末尾添加 1

            如果你想插入一个元素,请使用insert()

            a = numpy.insert(a, index, 1) 在这种情况下,您可以将 1 放在您想要的位置,使用索引来设置数组中的位置。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-06-30
              • 2019-04-08
              • 1970-01-01
              • 1970-01-01
              • 2018-04-11
              • 2020-06-06
              • 1970-01-01
              相关资源
              最近更新 更多