我想通过克隆Mx1 ndarray N次来创建一个MxN numpy数组。是否有一种有效的pythonic方法来代替循环?
顺便说一句,以下方法对我不起作用(X是我的Mx1数组):
numpy.concatenate((X, numpy.tile(X,N)))
因为它创建了[M * N,1]数组而不是[M,N]
答案 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]])