2016-03-01 3 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]]]) 

Пустой массив желаемой целевой формы

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

приятный, это примерно в 3 раза быстрее, чем 'np.pad' на моем примере использования (более 1 миллиона матриц) – 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]]]) 
Смежные вопросы