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

hwamh0ep  于 2023-05-16  发布在  Python
关注(0)|答案(4)|浏览(167)

我想通过克隆一个Mx1ndarray N次来创建一个MxN numpy数组。有没有一种高效的Python方法来代替循环?
顺便说一句,下面的方法对我不起作用(X是我的Mx1数组):

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

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

6rvt4ljy

6rvt4ljy1#

你很接近了,你想使用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

zd287kbt

zd287kbt2#

可以使用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]])
v8wbuo2f

v8wbuo2f3#

你试过这个吗:

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

kcugc4gi4#

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

检查所有这些是否等价:

  • 网格法和NP阵列法

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阵列和np块方法

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

相关问题