2016-11-19 3 views
4

Если я запускаю следующее:Скопируйте Numpy массив в части другого массива

import numpy as np 
a = np.arange(9) 
a = a.reshape((3,3)) 

Я получаю это:

a = [[0 1 2] 
    [3 4 5] 
    [6 7 8]] 

Если я создаю больший массив так:

b = np.zeros((5,5)) 
b = [[ 0. 0. 0. 0. 0.] 
    [ 0. 0. 0. 0. 0.] 
    [ 0. 0. 0. 0. 0.] 
    [ 0. 0. 0. 0. 0.] 
    [ 0. 0. 0. 0. 0.]] 

Как эффективно копировать a в b, чтобы получить такой массив?

# border of 0 surrounding a to be filled in with other data later 
b = [[ 0. 0. 0. 0. 0.] 
    [ 0. 1. 2. 3. 0.] 
    [ 0. 4. 5. 6. 0.] 
    [ 0. 7. 8. 9. 0.] 
    [ 0. 0. 0. 0. 0.]] 

Я ищу функцию встроенного в numpy, если она существует.

ответ

6

Вы можете указать b[1:4, 1:4] для обозначения части:

>>> import numpy as np 
>>> a = np.arange(9) 
>>> a = a.reshape((3, 3)) 
>>> b = np.zeros((5, 5)) 
>>> b[1:4, 1:4] = a 
>>> b 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 1., 2., 0.], 
     [ 0., 3., 4., 5., 0.], 
     [ 0., 6., 7., 8., 0.], 
     [ 0., 0., 0., 0., 0.]]) 

>>> b[1:4,1:4] = a + 1 # If you really meant `[1, 2, ..., 9]` 
>>> b 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 1., 2., 3., 0.], 
     [ 0., 4., 5., 6., 0.], 
     [ 0., 7., 8., 9., 0.], 
     [ 0., 0., 0., 0., 0.]]) 
+0

Это '[ 1..9] 'была ошибкой с моей стороны, но это прекрасно решает проблему, которая у меня была. – rlee827

1

Просто в качестве альтернативы, если вы хотите другое значение пэда, отличное от нуля, вы можете использовать эту опцию

>>> a = np.arange(9.).reshape(3,3) 
>>> np.pad(a, 1, 'constant', constant_values=0) 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 1., 2., 0.], 
     [ 0., 3., 4., 5., 0.], 
     [ 0., 6., 7., 8., 0.], 
     [ 0., 0., 0., 0., 0.]]) 
>>> np.pad(a, 1, 'constant', constant_values=5) 
array([[ 5., 5., 5., 5., 5.], 
     [ 5., 0., 1., 2., 5.], 
     [ 5., 3., 4., 5., 5.], 
     [ 5., 6., 7., 8., 5.], 
     [ 5., 5., 5., 5., 5.]]) 
Смежные вопросы