繁体   English   中英

用零扩展矩阵的numpy数组

[英]Expanding a numpy array of matrices with zeros

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

例:

# 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]]]) #
'''

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行或一列。 但是我已经说明了一步。

您将要使用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]]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM