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 而不是tilerepmat 等。 您可能不需要展开它。例如,如果它与 [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次的主要内容,如果未能解决你的问题,请参考以下文章

Python入门第四十八天Python丨NumPy 数组连接

对numpy数组中的每个第n个条目进行二次采样

Python中numpy 数组的切片操作

可以将numpy数组插入python中的函数吗?

python numpy详解

Numpy基础