我希望通过将一个Mx1的ndarray克隆N次来创建一个MxN的numpy数组。是否有一种高效的Pythonic方法来实现这个目标而不需要用循环?
顺便说一下,以下方法对我无效(X是我的Mx1数组):
numpy.concatenate((X, numpy.tile(X,N)))
由于它创建了一个[M*N,1]数组而不是[M,N]。
我希望通过将一个Mx1的ndarray克隆N次来创建一个MxN的numpy数组。是否有一种高效的Pythonic方法来实现这个目标而不需要用循环?
顺便说一下,以下方法对我无效(X是我的Mx1数组):
numpy.concatenate((X, numpy.tile(X,N)))
由于它创建了一个[M*N,1]数组而不是[M,N]。
你已经接近了,你需要使用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
np.array
而不是np.vstack
。 - Evidlon = 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]]
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]])
tile(X,N)
可以实现这个功能。 - gg349tile
гҖҒrepmat
зӯүж–№жі•пјҢиҖҢжҳҜдҪҝз”Ёе№ҝж’ӯгҖӮ - YXDnumpy
会自动进行广播。实际上,您可以使用以下方法来扩展数组:X + np.zeros(N)
。 - hpaulj