Python:连接(或克隆)一个numpy数组N次
Posted
技术标签:
【中文标题】Python:连接(或克隆)一个numpy数组N次【英文标题】:Python: Concatenate (or clone) a numpy array N times 【发布时间】:2014-05-03 06:39:19 【问题描述】:我想通过克隆 Mx1 ndarray N 次来创建一个 MxN numpy 数组。有没有一种有效的 Pythonic 方式来代替循环?
顺便说一句,以下方式对我不起作用(X 是我的 Mx1 数组):
numpy.concatenate((X, numpy.tile(X,N)))
因为它创建了一个 [M*N,1] 数组而不是 [M,N]
【问题讨论】:
tile(X,N)
会做到的。
(num)Pythonic 的方式不是这样做,而是使用broadcasting 而不是tile
和repmat
等。
您可能不需要展开它。例如,如果它与 [M,N] 或 [1,N] 矩阵相加或相乘,则结果将为 [M,N]。 numpy
为您广播。事实上,您可以使用它来扩展数组:X + np.zeros(N)
.
【参考方案1】:
你很亲密,你想使用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
【讨论】:
【参考方案2】:你可以使用vstack:
numpy.vstack([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]])
【讨论】:
vstack 在我们需要重复的多维数组时起作用,例如:a=[[1,2,3,4][5,6,7,8]] 变为 [[1, 2,3,4][5,6,7,8][1,2,3,4][5,6,7,8]] 与 np.vstack([a]*2)。其他方法让你 [[1,2,3,4][1,2,3,4][5,6,7,8][5,6,7,8]] 是否还需要vstack
?为什么不只是np.array([X] * N)
?【参考方案3】:
你试过了吗:
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]]
【讨论】:
【参考方案4】: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]])
【讨论】:
以上是关于Python:连接(或克隆)一个numpy数组N次的主要内容,如果未能解决你的问题,请参考以下文章