Numpy:添加行和列

时间:2015-03-30 11:24:43

标签: python arrays numpy

如何将一行和一列添加到numpy数组中。阵列的形状(480,639,3),我希望有形状(481,640,3)。新的行和列应填充零,如下所示:

[43,42,40],         ...        [64,63,61], [0,0,0]
   ...              ...            ...     [0,0,0]
[29,29,29],         ...        [38,37,35], [0,0,0]
[0,0,0], [0,0,0]    ...                    [0,0,0]

要添加新列,请执行以下操作:

b = numpy.zeros((480,640,3), dtype = int)
b[:,:-1] = old_arry

我怎么能添加一行?我是否要使用循环或存在更好的方法来执行此操作?

3 个答案:

答案 0 :(得分:3)

您可以使用pad

>>> old = np.random.random_integers(0, 100, size=(480, 640))
>>> np.pad(old, pad_width=((0, 1), (0, 1)), mode='constant')
array([[ 66,  22,  51, ...,  18,  15,   0],
       [ 28,  12,  43, ...,   8,  38,   0],
       [ 55,  43,  89, ...,  67,  58,   0],
       ...,
       [ 17,  25, 100, ...,  12,  52,   0],
       [ 97,  59,  82, ...,  38,  97,   0],
       [  0,   0,   0, ...,   0,   0,   0]])
>>> np.pad(old, pad_width=((0, 1), (0, 1)), mode='constant').shape
(481, 641)
>>>

您也可以将其写为np.pad(old, ((0, 1), (0, 1)), mode='constant'),即不使用pad_width关键字。要为填充区域设置不同的值,请参阅文档中的constant_values参数。

答案 1 :(得分:1)

您可以使用np.vstack逐行堆叠数组,并使用np.hstack按列堆叠数组。见代码:

>>> import numpy as np
>>> x = np.arange(480*639*3).reshape((480,639,3))
>>> new_row = np.zeros((639,3))
>>> x = np.vstack((x,new_row[np.newaxis,:,:]))
>>> x.shape
(481, 639, 3)
>>> new_col = np.zeros((481,3))
>>> x = np.hstack([x, new_col[:,np.newaxis,:]])
>>> x.shape
(481, 640, 3)

答案 2 :(得分:0)

您可以一次展开两个尺寸,也可以一次展开一个尺寸。操作相同 - 创建目标数组,并将旧数据复制到适当的切片。 pad在幕后做了这件事。

b = numpy.zeros((481,640,3), dtype = int)
b[:-1,:-1,:] = old_arry

例如:

In [527]: x=np.ones((2,2,3))
In [528]: y=np.zeros((3,3,3))
In [529]: y[:-1,:-1:,:]=x
In [530]: y
Out[530]: 
array([[[ 1.,  1.,  1.],
        [ 1.,  1.,  1.],
        [ 0.,  0.,  0.]],

       [[ 1.,  1.,  1.],
        [ 1.,  1.,  1.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])