如何将一个额外的列添加到一个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_[ ... ]
是vstack
和hstack
有用替代品,用方括号[]代替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], ...