【问题标题】:Concatenate a NumPy array to another NumPy array将 NumPy 数组连接到另一个 NumPy 数组
【发布时间】:2012-04-04 05:47:03
【问题描述】:

我有一个 numpy_array。类似[ a b c ]

然后我想将它与另一个 NumPy 数组连接起来(就像我们创建一个列表列表一样)。我们如何创建一个包含 NumPy 数组的 NumPy 数组?

我尝试做以下没有任何运气

>>> M = np.array([])
>>> M
array([], dtype=float64)
>>> M.append(a,axis=0)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'append'
>>> a
array([1, 2, 3])

【问题讨论】:

  • 您可以创建一个“数组数组”(您使用对象数组),但您几乎肯定不想这样做。你想做什么?你只想要一个二维数组吗?
  • 数组的数组称为嵌套数组。该线程中的三个答案是关于不保留嵌套结构的 np.append() 。这是因为一个没有明确例子的问题。

标签: python numpy


【解决方案1】:
In [1]: import numpy as np

In [2]: a = np.array([[1, 2, 3], [4, 5, 6]])

In [3]: b = np.array([[9, 8, 7], [6, 5, 4]])

In [4]: np.concatenate((a, b))
Out[4]: 
array([[1, 2, 3],
       [4, 5, 6],
       [9, 8, 7],
       [6, 5, 4]])

或者这个:

In [1]: a = np.array([1, 2, 3])

In [2]: b = np.array([4, 5, 6])

In [3]: np.vstack((a, b))
Out[3]: 
array([[1, 2, 3],
       [4, 5, 6]])

【讨论】:

  • 嗨,当我运行它时,我得到了这个 np.concatenate((a,b),axis=1) 输出:array([1, 2, 3, 2, 3, 4]) 但是什么我要找的是 numpy 二维数组??
  • @Fraz:我添加了 Sven 的 vstack() 想法。你知道你可以用array([[1,2,3],[2,3,4]]) 创建数组,对吧?
  • concatenate() 是我需要的。
  • numpy.vstack 在序列参数中可以接受超过 2 个数组。因此,如果您需要组合 2 个以上的数组,vstack 会更方便。
  • @oneleggedmule concatenate 也可以带多个数组
【解决方案2】:

好吧,错误信息说明了一切:NumPy 数组没有append() 方法。不过有一个免费功能numpy.append()

numpy.append(M, a)

这将创建一个新数组,而不是在原地改变 M。请注意,使用numpy.append() 涉及复制两个数组。如果您使用固定大小的 NumPy 数组,您将获得性能更好的代码。

【讨论】:

  • 嗨..当我尝试这个..我得到这个 >>> np.append(M,a) array([ 1., 2., 3.]) >>> np.append (M,b) array([ 2., 3., 4.]) >>> M array([], dtype=float64) 我希望 M 是一个二维数组??
  • @Fraz:看看numpy.vstack()
  • 我认为这应该是公认的答案,因为它准确地回答了这一点。
  • 这个答案不适合这个问题。它只是从您放入的任何结构中生成一个扁平数组。例如,对于 np.append(arr1,arr2),其中 arr1 和 arr2 为 3x3 数组,输出结构为 1x18:array([1, 2, 0, 0, 1, 1, 1, 1, 2, 0, 1, 0, 0, 0, 1, 1, 0, 1])。这不是所要求的,而是要求一个嵌套数组。
【解决方案3】:

你可以使用numpy.append()...

import numpy

B = numpy.array([3])
A = numpy.array([1, 2, 2])
B = numpy.append( B , A )

print B

> [3 1 2 2]

这不会创建两个单独的数组,而是将两个数组附加到一个单维数组中。

【讨论】:

  • 请求的是嵌套数组,而不是扁平数组。
【解决方案4】:

Sven 说了这么多,只是要非常小心,因为调用 append 时会自动调整类型。

In [2]: import numpy as np

In [3]: a = np.array([1,2,3])

In [4]: b = np.array([1.,2.,3.])

In [5]: c = np.array(['a','b','c'])

In [6]: np.append(a,b)
Out[6]: array([ 1.,  2.,  3.,  1.,  2.,  3.])

In [7]: a.dtype
Out[7]: dtype('int64')

In [8]: np.append(a,c)
Out[8]: 
array(['1', '2', '3', 'a', 'b', 'c'], 
      dtype='|S1')

如您所见,根据内容,dtype 从 int64 变为 float32,然后变为 S1

【讨论】:

  • 请求嵌套数组。
【解决方案5】:

我在寻找稍微不同的东西时发现了这个链接,如何开始将数组对象附加到 empty numpy 数组,但尝试了此页面上的所有解决方案均无济于事。

然后我找到了这个问答:How to add a new row to an empty numpy array

这里的要点:

“开始”你想要的数组的方法是:

arr = np.empty((0,3), int)

然后你可以像这样使用连接来添加行:

arr = np.concatenate( ( arr, [[x, y, z]] ) , axis=0)

另见https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html

【讨论】:

  • 这就是我最终不得不使用的东西,但它看起来确实很麻烦。
【解决方案6】:

实际上,人们总是可以创建一个普通的 numpy 数组列表并在以后进行转换。

In [1]: import numpy as np

In [2]: a = np.array([[1,2],[3,4]])

In [3]: b = np.array([[1,2],[3,4]])

In [4]: l = [a]

In [5]: l.append(b)

In [6]: l = np.array(l)

In [7]: l.shape
Out[7]: (2, 2, 2)

In [8]: l
Out[8]: 
array([[[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]]])

【讨论】:

    【解决方案7】:

    我有同样的问题,我无法评论@Sven Marnach 的答案(没有足够的代表,天哪,我记得 Stackoverflow 刚开始的时候......)。

    将随机数列表添加到 10 X 10 矩阵。

    myNpArray = np.zeros([1, 10])
    for x in range(1,11,1):
        randomList = [list(np.random.randint(99, size=10))]
        myNpArray = np.vstack((myNpArray, randomList))
    myNpArray = myNpArray[1:]
    

    使用 np.zeros() 创建一个包含 1 x 10 个零的数组。

    array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
    

    然后使用 np.random 创建一个包含 10 个随机数的列表并分配给 randomList。 循环将其堆叠 10 高。我们只需要记住删除第一个空条目。

    myNpArray
    
    array([[31., 10., 19., 78., 95., 58.,  3., 47., 30., 56.],
           [51., 97.,  5., 80., 28., 76., 92., 50., 22., 93.],
           [64., 79.,  7., 12., 68., 13., 59., 96., 32., 34.],
           [44., 22., 46., 56., 73., 42., 62.,  4., 62., 83.],
           [91., 28., 54., 69., 60., 95.,  5., 13., 60., 88.],
           [71., 90., 76., 53., 13., 53., 31.,  3., 96., 57.],
           [33., 87., 81.,  7., 53., 46.,  5.,  8., 20., 71.],
           [46., 71., 14., 66., 68., 65., 68., 32.,  9., 30.],
           [ 1., 35., 96., 92., 72., 52., 88., 86., 94., 88.],
           [13., 36., 43., 45., 90., 17., 38.,  1., 41., 33.]])
    

    所以在一个函数中:

    def array_matrix(random_range, array_size):
        myNpArray = np.zeros([1, array_size])
        for x in range(1, array_size + 1, 1):
            randomList = [list(np.random.randint(random_range, size=array_size))]
            myNpArray = np.vstack((myNpArray, randomList))
        return myNpArray[1:]
    

    使用随机数 0 - 1000 的 7 x 7 数组

    array_matrix(1000, 7)
    
    array([[621., 377., 931., 180., 964., 885., 723.],
           [298., 382., 148., 952., 430., 333., 956.],
           [398., 596., 732., 422., 656., 348., 470.],
           [735., 251., 314., 182., 966., 261., 523.],
           [373., 616., 389.,  90., 884., 957., 826.],
           [587., 963.,  66., 154., 111., 529., 945.],
           [950., 413., 539., 860., 634., 195., 915.]])
    

    【讨论】:

      【解决方案8】:

      如果我理解您的问题,这是一种方法。假设你有:

      a = [4.1, 6.21, 1.0]
      

      所以这里有一些代码......

      def array_in_array(scalarlist):
          return [(x,) for x in scalarlist]
      

      这导致:

      In [72]: a = [4.1, 6.21, 1.0]
      
      In [73]: a
      Out[73]: [4.1, 6.21, 1.0]
      
      In [74]: def array_in_array(scalarlist):
         ....:     return [(x,) for x in scalarlist]
         ....: 
      
      In [75]: b = array_in_array(a)
      
      In [76]: b
      Out[76]: [(4.1,), (6.21,), (1.0,)]
      

      【讨论】:

        【解决方案9】:

        试试这个代码:

        import numpy as np
        
        a1 = np.array([])
        
        n = int(input(""))
        
        for i in range(0,n):
            a = int(input(""))
            a1 = np.append(a, a1)
            a = 0
        
        print(a1)
        

        你也可以用数组代替“a”

        【讨论】:

          【解决方案10】:

          这适用于使用numpy's ndarrays 的人。 numpy.concatenate() 函数也可以正常工作。

          >>a = np.random.randint(0,9, size=(10,1,5,4))
          >>a.shape
          (10, 1, 5, 4)
          
          >>b = np.random.randint(0,9, size=(15,1,5,4))
          >>b.shape
          (15, 1, 5, 4)
          
          >>X = np.concatenate((a, b))
          >>X.shape
          (25, 1, 5, 4)
          

          vstack()的方式差不多

          >>Y = np.vstack((a,b))
          >>Y.shape
          (25, 1, 5, 4)
          

          【讨论】:

            【解决方案11】:

            当您想沿现有轴(按行)连接时,np.vstacknp.concatenate 将适合您。

            有关串联操作的详细列表,请参阅official docs

            【讨论】:

              【解决方案12】:

              有几种方法可以将数组堆叠在一起,具体取决于堆栈的方向。 例如,您可以考虑 np.stack() (doc)、np.vstack() (doc) 和 np.hstack() (doc)。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-01-22
                • 2020-12-21
                • 2011-07-27
                • 1970-01-01
                • 2022-01-09
                • 1970-01-01
                • 2012-03-03
                相关资源
                最近更新 更多