2016-03-01 47 views
0

用零填充矩阵阵列的最有效方法是什么?使用零来展开一个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]]]) # 
''' 

回答

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

期望的目标形状的坯件阵列从M

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

复制值来目标在右侧切片范围内。

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

不错,这比我的使用案例中的np.pad快了3倍(超过100万个矩阵) – Fnord

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