假设我有一个NumPy数组,a:
a = np.array([
[1, 2, 3],
[2, 3, 4]
])
Run Code Online (Sandbox Code Playgroud)
我想添加一列零来获取数组b:
b = np.array([
[1, 2, 3, 0],
[2, 3, 4, 0]
])
Run Code Online (Sandbox Code Playgroud)
我怎样才能在NumPy中轻松完成这项工作?
den*_*nis 291
np.r_[ ... ]并且np.c_[ ... ]
是有用的替代vstack和hstack,用方括号[]代替圆().
几个例子:
: 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.])
Run Code Online (Sandbox Code Playgroud)
(方括号[]而不是round()的原因是Python扩展为例如1:4的正方形 - 超载的奇迹.)
Jos*_*del 164
我认为更直接的解决方案和更快的启动是执行以下操作:
import numpy as np
N = 10
a = np.random.rand(N,N)
b = np.zeros((N,N+1))
b[:,:-1] = a
Run Code Online (Sandbox Code Playgroud)
和时间:
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
Run Code Online (Sandbox Code Playgroud)
小智 136
用途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]])
Run Code Online (Sandbox Code Playgroud)
Pet*_*mit 47
使用hstack的一种方法是:
b = np.hstack((a, np.zeros((a.shape[0], 1), dtype=a.dtype)))
Run Code Online (Sandbox Code Playgroud)
Bjö*_*örn 36
我发现以下最优雅:
b = np.insert(a, 3, values=0, axis=1) # Insert values before column 3
Run Code Online (Sandbox Code Playgroud)
一个优点insert是它还允许您在数组内的其他位置插入列(或行).此外,您可以轻松插入整个矢量,而不是插入单个值,例如复制最后一列:
b = np.insert(a, insert_index, values=a[:,2], axis=1)
Run Code Online (Sandbox Code Playgroud)
这导致:
array([[1, 2, 3, 3],
[2, 3, 4, 4]])
Run Code Online (Sandbox Code Playgroud)
对于时机,insert可能比JoshAdel的解决方案慢:
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 µs 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 µs per loop
In [5]: %timeit b = np.insert(a, 3, values=0, axis=1)
100000 loops, best of 3: 10.2 µs per loop
Run Code Online (Sandbox Code Playgroud)
Nic*_*mer 29
我也对这个问题感兴趣并比较了它的速度
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
Run Code Online (Sandbox Code Playgroud)
这对于任何输入向量都做同样的事情a.成长时间a:
请注意,所有非连续变体(特别是 stack/ vstack)最终都比所有连续变体更快.column_stack(因为它的清晰度和速度)似乎是一个很好的选择,如果你需要连续性.
重现情节的代码:
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,
)
Run Code Online (Sandbox Code Playgroud)
han*_*luc 12
>>> 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.]])
Run Code Online (Sandbox Code Playgroud)
小智 11
Numpy 的np.append方法接受三个参数,前两个是 2D numpy 数组,第三个是轴参数,指示沿哪个轴附加:
import numpy as np
x = np.array([[1,2,3], [4,5,6]])
print("Original x:")
print(x)
y = np.array([[1], [1]])
print("Original y:")
print(y)
print("x appended to y on axis of 1:")
print(np.append(x, y, axis=1))
Run Code Online (Sandbox Code Playgroud)
印刷:
Original x:
[[1 2 3]
[4 5 6]]
Original y:
[[1]
[1]]
y appended to x on axis of 1:
[[1 2 3 1]
[4 5 6 1]]
Run Code Online (Sandbox Code Playgroud)
Roe*_*ven 10
假设M是(100,3)ndarray并且y是(100,)ndarray append可以如下使用:
M=numpy.append(M,y[:,None],1)
Run Code Online (Sandbox Code Playgroud)
诀窍是使用
y[:, None]
Run Code Online (Sandbox Code Playgroud)
这将转换y为(100,1)2D阵列.
M.shape
Run Code Online (Sandbox Code Playgroud)
现在给
(100, 4)
Run Code Online (Sandbox Code Playgroud)
小智 8
我喜欢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
Run Code Online (Sandbox Code Playgroud)
np.insert 也达到目的。
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]])
Run Code Online (Sandbox Code Playgroud)
它沿一个轴new_col在给定索引之前在此处插入值idx。换句话说,新插入的值将占据该idx列并向后移动原始位置idx。
对我来说,下一个方法看起来非常直观和简单。
zeros = np.zeros((2,1)) #2 is a number of rows in your array.
b = np.hstack((a, zeros))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
383146 次 |
| 最近记录: |