Python:连接(或克隆)一个numpy数组N次

时间:2014-03-25 12:13:45

标签: python arrays numpy append concatenation

我想通过克隆Mx1 ndarray N次来创建一个MxN numpy数组。是否有一种有效的pythonic方法来代替循环?

顺便说一句,以下方法对我不起作用(X是我的Mx1数组):

   numpy.concatenate((X, numpy.tile(X,N)))

因为它创建了[M * N,1]数组而不是[M,N]

4 个答案:

答案 0 :(得分:48)

你很接近,你想使用np.tile,但是喜欢这样:

a = np.array([0,1,2])
np.tile(a,(3,1))

结果:

array([[0, 1, 2],
   [0, 1, 2],
   [0, 1, 2]])

如果您致电np.tile(a,3),您将获得concatenate行为,就像您看到的那样

array([0, 1, 2, 0, 1, 2, 0, 1, 2])

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

答案 1 :(得分:10)

您可以使用vstack

numpy.vstack([X]*N)

e.g。

    >>> import numpy as np
    >>> X = np.array([1,2,3,4])
    >>> N = 7
    >>> np.vstack([X]*N)
    array([[1, 2, 3, 4],
           [1, 2, 3, 4],
           [1, 2, 3, 4],
           [1, 2, 3, 4],
           [1, 2, 3, 4],
           [1, 2, 3, 4],
           [1, 2, 3, 4],
           [1, 2, 3, 4],
           [1, 2, 3, 4]])

答案 2 :(得分:1)

你试过这个:

n = 5
X = numpy.array([1,2,3,4])
Y = numpy.array([X for _ in xrange(n)])
print Y
Y[0][1] = 10
print Y

打印:

[[1 2 3 4]
 [1 2 3 4]
 [1 2 3 4]
 [1 2 3 4]
 [1 2 3 4]]

[[ 1 10  3  4]
 [ 1  2  3  4]
 [ 1  2  3  4]
 [ 1  2  3  4]
 [ 1  2  3  4]]

答案 3 :(得分:0)

np.vstack 的替代方法是 np.array 以这种方式使用(@bluenote10 在评论中也提到):

x = np.arange([-3,4]) # array([-3, -2, -1,  0,  1,  2,  3])
N = 3 # number of time you want the array repeated
X0 = np.array([x] * N)

给出:

array([[-3, -2, -1,  0,  1,  2,  3],
       [-3, -2, -1,  0,  1,  2,  3],
       [-3, -2, -1,  0,  1,  2,  3]])

您也可以通过这种方式使用 meshgrid(当然,编写时间更长,而且有点费力,但您还有另一种可能性,并且您可能会在此过程中学到一些新东西):

X1,_ = np.meshgrid(a,np.empty([N]))

>>> X1 显示:

array([[-3, -2, -1,  0,  1,  2,  3],
       [-3, -2, -1,  0,  1,  2,  3],
       [-3, -2, -1,  0,  1,  2,  3]])

检查所有这些是否相等:

  • meshgrid 和 np.array 方法

    X0 == X1

结果:

array([[ True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True]])
  • np.array 和 np.vstack 方法

    X0 == np.vstack([x] * 3)

结果:

array([[ True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True]])
  • np.array 和 np.tile 方法

    X0 == np.tile(x,(N,1))

结果:

array([[ True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True]])
相关问题