Python 用零展开矩阵的numpy数组

Python 用零展开矩阵的numpy数组,python,numpy,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 v

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

例如:

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

你会想用它来做这件事。您可以使用第二个输入参数指定数组每个维度中数据前后的填充量。然后指定一个常量填充类型,其中填充值为0(默认值)


你会想用它来做这件事。您可以使用第二个输入参数指定数组每个维度中数据前后的填充量。然后指定一个常量填充类型,其中填充值为0(默认值)


np.pad
将起作用,但在这种情况下,它是过度杀伤力。我们可以通过以下方式直接实现:

示例3d阵列(不同的尺寸会使更改更加明显)

所需目标形状的空白数组

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行或列。但我所演示的是一步完成的。

np.pad
将起作用,但在这种情况下,它是多余的。我们可以通过以下方式直接实现:

示例3d阵列(不同的尺寸会使更改更加明显)

所需目标形状的空白数组

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行或列。但是我所演示的是一步完成的。

nice,这比我的用例(超过100万个矩阵)上的
np.pad
快约3倍。nice,这比我的用例(超过100万个矩阵)上的
np.pad
快约3倍