给定以下二维数组:

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

我想在第二轴上加上一列0,得到:

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

当前回答

使用hstack的一种方法是:

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

其他回答

有点晚了,但还没有人发布这个答案,所以为了完整起见:你可以在一个普通的Python数组上使用列表推导式来完成:

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

我喜欢这个:

new_column = np.zeros((len(a), 1))
b = np.block([a, new_column])

我认为:

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

更优雅。

np。插入也可以。

matA = np.array([[1,2,3], 
                 [2,3,4]])
idx = 3
new_col = np.array([0, 0])
np.insert(matA, idx, new_col, axis=1)

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

它沿着一个轴插入值,这里是new_col,在给定索引之前,这里是idx。换句话说,新插入的值将占据idx列,并将最初在idx处和之后的值向后移动。

我喜欢JoshAdel的回答,因为他关注的是表现。一个较小的性能改进是避免使用零进行初始化的开销,而这些初始化只会被覆盖。当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