numpy - 调整大小填充0

时间:2015-10-21 10:23:17

标签: 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]])

shape = (3,5)

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

b = np.resize(a,(3,8))

但它返回:

[[ 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.  ]]

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

[[ 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. ]]

5 个答案:

答案 0 :(得分:10)

使用np.lib.pad -

np.lib.pad(a, ((0,0),(0,3)), 'constant', constant_values=(0))

示例运行 -

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.  ]])

运行时测试 -

本节介绍了迄今为止针对问题中列出的大小发布的方法的运行时测试,并按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

答案 1 :(得分:6)

来自np.resize()的文件:

  

如果新数组大于原始数组,则为新数组   数组中充满了a。的重复副本。

未使用零,但实际值为a

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

np.hstack([a, np.zeros([3, 3])])

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

答案 2 :(得分:4)

绝对可以使用resize()

  

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

b = a.transpose().copy()
b.resize((8,3), refcheck=False)
b = a.transpose()

输出:

[[ 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.  ]]

<强>限制:

0的扩展只能应用于第一维。

答案 3 :(得分:3)

另一种选择(尽管np.hstack可能最好as in M. Massias' answer)。

初始化一个零数组:

b = np.zeros((3, 8))

使用切片语法填充:

b[:3, :5] = a

答案 4 :(得分:3)

np.concatenate

np.concatenate((a,np.zeros((3,3))), axis=1)
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.  ]])