如何将一个额外的列添加到一个numpy数组

可以说我有一个numpy数组a

 a = np.array([[1,2,3], [2,3,4]]) 

我想添加一列零来获得数组b

 b = np.array([[1,2,3,0], [2,3,4,0]]) 

我怎么能在numpy中轻松做到这一点?

我认为一个更直接的解决scheme,更快的启动是做以下几点:

 import numpy as np N = 10 a = np.random.rand(N,N) b = np.zeros((N,N+1)) b[:,:-1] = a 

和时间:

 In [23]: N = 10 In [24]: a = np.random.rand(N,N) In [25]: %timeit b = np.hstack((a,np.zeros((a.shape[0],1)))) 10000 loops, best of 3: 19.6 us per loop In [27]: %timeit b = np.zeros((a.shape[0],a.shape[1]+1)); b[:,:-1] = a 100000 loops, best of 3: 5.62 us per loop 

np.r_[ ... ]np.c_[ ... ]vstackhstack有用替代品,用方括号[]代替round()。
几个例子:

 : import numpy as np : N = 3 : A = np.eye(N) : np.c_[ A, np.ones(N) ] # add a column array([[ 1., 0., 0., 1.], [ 0., 1., 0., 1.], [ 0., 0., 1., 1.]]) : np.c_[ np.ones(N), A, np.ones(N) ] # or two array([[ 1., 1., 0., 0., 1.], [ 1., 0., 1., 0., 1.], [ 1., 0., 0., 1., 1.]]) : np.r_[ A, [A[1]] ] # add a row array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.], [ 0., 1., 0.]]) : # not np.r_[ A, A[1] ] : np.r_[ A[0], 1, 2, 3, A[1] ] # mix vecs and scalars array([ 1., 0., 0., 1., 2., 3., 0., 1., 0.]) : np.r_[ A[0], [1, 2, 3], A[1] ] # lists array([ 1., 0., 0., 1., 2., 3., 0., 1., 0.]) : np.r_[ A[0], (1, 2, 3), A[1] ] # tuples array([ 1., 0., 0., 1., 2., 3., 0., 1., 0.]) : np.r_[ A[0], 1:4, A[1] ] # same, 1:4 == arange(1,4) == 1,2,3 array([ 1., 0., 0., 1., 2., 3., 0., 1., 0.]) 

(方括号[]代替round()的原因是Python扩展了例如1:4的方块 – 超载的奇迹。)

使用numpy.append

 >>> a = np.array([[1,2,3],[2,3,4]]) >>> a array([[1, 2, 3], [2, 3, 4]]) >>> z = np.zeros((2,1), dtype=int64) >>> z array([[0], [0]]) >>> np.append(a, z, axis=1) array([[1, 2, 3, 0], [2, 3, 4, 0]]) 

在写这个问题的时候,我用一种方法提出了使用hstack的方法

 b = np.hstack((a, np.zeros((a.shape[0], 1), dtype=a.dtype))) 

任何其他(更优雅的解决scheme)欢迎!

我认为:

 np.column_stack((a, zeros(shape(a)[0]))) 

更优雅。

我觉得最优雅的是:

 b = np.insert(a, 3, values=0, axis=1) # insert values before column 3 

insert一个好处是,它也允许你在数组中的其他地方插入列(或行)。 而不是插入一个单一的值,你可以很容易地插入一个完整的向量,例如,最后一列:

 b = np.insert(a, insert_index, values=a[:,2], axis=1) 

这导致:

 array([[1, 2, 3, 3], [2, 3, 4, 4]]) 

对于时间, insert可能比JoshAdel的解决scheme慢:

 In [1]: N = 10 In [2]: a = np.random.rand(N,N) In [3]: %timeit b = np.hstack((a,np.zeros((a.shape[0],1)))) 100000 loops, best of 3: 7.5 us per loop In [4]: %timeit b = np.zeros((a.shape[0],a.shape[1]+1)); b[:,:-1] = a 100000 loops, best of 3: 2.17 us per loop In [5]: %timeit b = np.insert(a, 3, values=0, axis=1) 100000 loops, best of 3: 10.2 us per loop 

np.concatenate也可以

 >>> a = np.array([[1,2,3],[2,3,4]]) >>> a array([[1, 2, 3], [2, 3, 4]]) >>> z = np.zeros((2,1)) >>> z array([[ 0.], [ 0.]]) >>> np.concatenate((a, z), axis=1) array([[ 1., 2., 3., 0.], [ 2., 3., 4., 0.]]) 

我喜欢JoshAdel的回答,因为关注performance。 一个小的性能改进是为了避免用零初始化的开销,只能被覆盖。 当N很大时,这有一个可测量的差别,空使用而不是零,并且零列被写为一个单独的步骤:

 In [1]: import numpy as np In [2]: N = 10000 In [3]: a = np.ones((N,N)) In [4]: %timeit b = np.zeros((a.shape[0],a.shape[1]+1)); b[:,:-1] = a 1 loops, best of 3: 492 ms per loop In [5]: %timeit b = np.empty((a.shape[0],a.shape[1]+1)); b[:,:-1] = a; b[:,-1] = np.zeros((a.shape[0],)) 1 loops, best of 3: 407 ms per loop 

假设M是(100,3)ndarray并且y是(100,)ndarray append可以使用如下:

 M=numpy.append(M,y[:,None],1) 

诀窍就是使用

 y[:, None] 

这将y转换为(100,1)2D数组。

 M.shape 

现在给

 (100, 4) 

我也对这个问题感兴趣,并且比较了这个速度

 numpy.c_[a, a] numpy.stack([a, a]).T numpy.vstack([a, a]).T numpy.ascontiguousarray(numpy.stack([a, a]).T) numpy.ascontiguousarray(numpy.vstack([a, a]).T) numpy.column_stack([a, a]) numpy.concatenate([a[:,None], a[:,None]], axis=1) numpy.concatenate([a[None], a[None]], axis=0).T 

对于任何input向量a都做同样的事情。 时机成长:

在这里输入图像描述

请注意,所有非连续变体(特别是stack / vstack )最终都比所有连续变体更快。 column_stack (为了清晰和快速)似乎是一个不错的select,如果你需要连续性。


代码重现情节:

 import numpy import perfplot perfplot.show( setup=lambda n: numpy.random.rand(n), kernels=[ lambda a: numpy.c_[a, a], lambda a: numpy.ascontiguousarray(numpy.stack([a, a]).T), lambda a: numpy.ascontiguousarray(numpy.vstack([a, a]).T), lambda a: numpy.column_stack([a, a]), lambda a: numpy.concatenate([a[:, None], a[:, None]], axis=1), lambda a: numpy.ascontiguousarray(numpy.concatenate([a[None], a[None]], axis=0).T), lambda a: numpy.stack([a, a]).T, lambda a: numpy.vstack([a, a]).T, lambda a: numpy.concatenate([a[None], a[None]], axis=0).T, ], labels=[ 'c_', 'ascont(stack)', 'ascont(vstack)', 'column_stack', 'concat', 'ascont(concat)', 'stack (non-cont)', 'vstack (non-cont)', 'concat (non-cont)' ], n_range=[2**k for k in range(20)], xlabel='len(a)', logx=True, logy=True, ) 

晚了一点,但没有人发布这个答案,所以为了完整起见:你可以用列表parsing,在一个普通的Python数组:

 source = a.tolist() result = [row + [0] for row in source] b = np.array(result) 

在我的情况下,我不得不添加一列到一个numpy数组

 X = array([ 6.1101, 5.5277, ... ]) X.shape => (97,) X = np.concatenate((np.ones((m,1), dtype=np.int), X.reshape(m,1)), axis=1) 

在X.shape =>(97,2)之后,

 array([[ 1. , 6.1101], [ 1. , 5.5277], ...