numpy - 调整大小填充0

Fab*_*nna 5 python arrays numpy

我有以下numpy数组:

a = np.array([[1.1,0.8,0.5,0,0],[1,0.85,0.5,0,0],[1,0.8,0.5,1,0]])
Run Code Online (Sandbox Code Playgroud)

shape = (3,5).

我想重新整形并将其调整为一个新的数组shape = (3,8),用每个行填充新值0.到目前为止,我尝试了以下方法:

b = np.resize(a,(3,8))
Run Code Online (Sandbox Code Playgroud)

但它返回:

[[ 1.1   0.8   0.5   0.    0.    1.    0.85  0.5 ]
 [ 0.    0.    1.    0.8   0.5   1.    0.    1.1 ]
 [ 0.8   0.5   0.    0.    1.    0.85  0.5   0.  ]]
Run Code Online (Sandbox Code Playgroud)

而不是预期的(对我来说):

[[ 1.1   0.8   0.5   0.    0.    0.    0.    0. ]
 [ 1.    0.85  0.5   0.    0.    0.    0.    0. ]
 [ 1.    0.8   0.5   1.    0.    0.    0.    0. ]]
Run Code Online (Sandbox Code Playgroud)

Div*_*kar 10

使用np.lib.pad-

np.lib.pad(a, ((0,0),(0,3)), 'constant', constant_values=(0))
Run Code Online (Sandbox Code Playgroud)

样品运行 -

In [156]: a
Out[156]: 
array([[ 1.1 ,  0.8 ,  0.5 ,  0.  ,  0.  ],
       [ 1.  ,  0.85,  0.5 ,  0.  ,  0.  ],
       [ 1.  ,  0.8 ,  0.5 ,  1.  ,  0.  ]])

In [157]: np.lib.pad(a, ((0,0),(0,3)), 'constant', constant_values=(0))
Out[157]: 
array([[ 1.1 ,  0.8 ,  0.5 ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ],
       [ 1.  ,  0.85,  0.5 ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ],
       [ 1.  ,  0.8 ,  0.5 ,  1.  ,  0.  ,  0.  ,  0.  ,  0.  ]])
Run Code Online (Sandbox Code Playgroud)

运行时测试 -

本节介绍了迄今为止针对问题中列出的大小并按比例扩展的方法的运行时测试100x.以下是时间测试结果 -

In [212]: def init_based(a,N):
     ...:   b = np.zeros((a.shape[0], a.shape[1]+N))
     ...:   b[:, :a.shape[1]] = a
     ...:   return b
     ...: 

In [213]: a = np.random.rand(3,5)

In [214]: N = 3

In [215]: %timeit np.lib.pad(a, ((0,0),(0,N)), 'constant', constant_values=(0))
     ...: %timeit np.hstack([a, np.zeros([a.shape[0], N])])
     ...: %timeit np.concatenate((a,np.zeros((a.shape[0],N))), axis=1)
     ...: %timeit init_based(a,N)
     ...: 
10000 loops, best of 3: 32.7 µs per loop
100000 loops, best of 3: 11.2 µs per loop
100000 loops, best of 3: 4.49 µs per loop
100000 loops, best of 3: 5.67 µs per loop

In [216]: a = np.random.rand(300,500)

In [217]: N = 300

In [218]: %timeit np.lib.pad(a, ((0,0),(0,N)), 'constant', constant_values=(0))
     ...: %timeit np.hstack([a, np.zeros([a.shape[0], N])])
     ...: %timeit np.concatenate((a,np.zeros((a.shape[0],N))), axis=1)
     ...: %timeit init_based(a,N)
     ...: 
100 loops, best of 3: 2.99 ms per loop
1000 loops, best of 3: 1.72 ms per loop
1000 loops, best of 3: 1.71 ms per loop
1000 loops, best of 3: 1.72 ms per loop
Run Code Online (Sandbox Code Playgroud)


Gab*_*Chu 7

当然你可以使用resize()

如果新数组大于原始数组,则新数组将填充 a 的重复副本。请注意,此行为与 a.resize(new_shape) 不同,后者填充零而不是 a 的重复副本。

b = a.transpose().copy()
b.resize((8,3), refcheck=False)
b = a.transpose()
Run Code Online (Sandbox Code Playgroud)

输出:

[[ 1.1   0.8   0.5   0.    0.    0.    0.    0.  ]
 [ 1.    0.85  0.5   0.    0.    0.    0.    0.  ]
 [ 1.    0.8   0.5   1.    0.    0.    0.    0.  ]]
Run Code Online (Sandbox Code Playgroud)

局限性:

用 0 填充只能应用于第一维。


P. *_*eri 6

来自以下文件np.resize():

如果新数组大于原始数组,则新数组将填充a的重复副本.

不使用零,但实际值为a.

相反,你可以使用np.hstack()np.zeros():

np.hstack([a, np.zeros([3, 3])])
Run Code Online (Sandbox Code Playgroud)

编辑:我没有测试速度,所以我建议你看看其他解决方案.


Leo*_*Leo 5

另一种选择(尽管np.hstack可能是最好的,如 M. Massias 的回答)。

初始化一个零数组:

b = np.zeros((3, 8))
Run Code Online (Sandbox Code Playgroud)

使用切片语法填充:

b[:3, :5] = a
Run Code Online (Sandbox Code Playgroud)