Python: 将一个numpy数组连接(或复制)N次

94

我希望通过将一个Mx1的ndarray克隆N次来创建一个MxN的numpy数组。是否有一种高效的Pythonic方法来实现这个目标而不需要用循环?

顺便说一下,以下方法对我无效(X是我的Mx1数组):

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

由于它创建了一个[M*N,1]数组而不是[M,N]。


3
tile(X,N) 可以实现这个功能。 - gg349
1
Pythonicзҡ„ж–№ејҸдёҚжҳҜдҪҝз”ЁtileгҖҒrepmatзӯүж–№жі•пјҢиҖҢжҳҜдҪҝз”Ёе№ҝж’ӯгҖӮ - YXD
2
你可能不需要扩展它。例如,如果它与[M,N]或[1,N]矩阵相加或相乘,则结果将为[M,N]。numpy会自动进行广播。实际上,您可以使用以下方法来扩展数组:X + np.zeros(N) - hpaulj
4个回答

157

你已经接近了,你需要使用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


33
你可以使用 vstack
numpy.vstack([X]*N)

或者数组(感谢下面的bluenote10):

numpy.array([X]*N)

例如

>>> 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]])

1
vstack 在需要重复多维数组时非常有用,例如:a=[[1,2,3,4][5,6,7,8]] 可以通过 np.vstack([a]*2) 变成 [[1,2,3,4][5,6,7,8][1,2,3,4][5,6,7,8]]。而其他方法会得到 [[1,2,3,4][1,2,3,4][5,6,7,8][5,6,7,8]]。 - Sidharth N. Kashyap
2
“vstack”是否必要?为什么不直接使用“np.array([X] * N)”? - bluenote10
1
这对于N=1不起作用。您应该使用np.array而不是np.vstack - Evidlo

4
你尝试过这个吗:
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
< p > 与 np.vstack 相对应的是这种使用方式的 np.array(也被 @bluenote10 在评论中提到):< /p>
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]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接