使用零扩展numpy矩阵数组

时间:2016-03-01 03:37:44

标签: python numpy

用零填充矩阵数组的最有效方法是什么?

示例:

# Lets construct an array of 2 matrices from 3 arrays of vectors
import numpy as np

A = np.array([[0,1,2],[3,4,5]])       # 2 vectors
B = np.array([[6,7,8],[9,10,11]])     # 2 vectors
C = np.array([[12,13,14],[15,16,17]]) # 2 vectors
M = np.dstack((A,B,C))
'''
# Result: array([[[ 0,  6, 12],
                  [ 1,  7, 13],
                  [ 2,  8, 14]],

                 [[ 3,  9, 15],
                  [ 4, 10, 16],
                  [ 5, 11, 17]]]) #
'''

我想为数组中的每个矩阵元素添加一列和/或一行零,例如:

'''
# Result: array([[[ 0,  6, 12, 0],
              [ 1,  7, 13, 0],
              [ 2,  8, 14, 0],
              [ 0,  0,  0, 0]],

             [[ 3,  9, 15, 0],
              [ 4, 10, 16, 0],
              [ 5, 11, 17, 0]
              [ 0,  0,  0, 0]]]) #
'''

2 个答案:

答案 0 :(得分:1)

np.pad会起作用,但对于这种情况来说它是矫枉过正的。我们可以直接用:

示例3d数组(不同的维度使更改更加明显)

In [408]: M=np.arange(2*3*4).reshape((2,3,4))    
In [409]: M
Out[409]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

所需目标形状的空白数组

In [410]: M1=np.zeros((2,4,5),M.dtype)

将值从M复制到右侧切片范围内的目标。

In [411]: M1[:,:-1,:-1]=M
In [412]: M1
Out[412]: 
array([[[ 0,  1,  2,  3,  0],
        [ 4,  5,  6,  7,  0],
        [ 8,  9, 10, 11,  0],
        [ 0,  0,  0,  0,  0]],

       [[12, 13, 14, 15,  0],
        [16, 17, 18, 19,  0],
        [20, 21, 22, 23,  0],
        [ 0,  0,  0,  0,  0]]])

需要这样的副本。没有办法扩大M本身的大小。 pad也返回一个新数组,执行了此分配和复制的通用版本。因此,效率问题并非如此。

您还可以在正确的维度中连接(或“追加”#0; 0行或列)。但我所说明的是一步到位。

答案 1 :(得分:0)

您将要使用numpy.pad来执行此操作。您可以使用第二个输入参数指定在数组的每个维度中的数据之前和之后填充的数量。然后指定一个常量填充类型,其中填充值为0(默认值)。

result = numpy.pad(M, ((0,0),(0,1),(0,1)), 'constant', constant_values=0)
array([[[ 0,  6, 12,  0],
        [ 1,  7, 13,  0],
        [ 2,  8, 14,  0],
        [ 0,  0,  0,  0]],

       [[ 3,  9, 15,  0],
        [ 4, 10, 16,  0],
        [ 5, 11, 17,  0],
        [ 0,  0,  0,  0]]])