Numpy массив: эффективно присваивать значения - PullRequest
0 голосов
/ 09 июня 2018

У меня есть массив, и я хочу пройтись по его значениям, чтобы обновить его следующим образом:

import numpy as np
arr=np.ones((5,7))
for i in range(1,arr.shape[0]-1):
    for j in range(1,arr.shape[1]-1):
        arr[i,j]=arr[i+1,j]+arr[i,j+1]

В результате, по желанию,

[[1. 1. 1. 1. 1. 1. 1.]
 [1. 2. 2. 2. 2. 2. 1.]
 [1. 2. 2. 2. 2. 2. 1.]
 [1. 2. 2. 2. 2. 2. 1.]
 [1. 1. 1. 1. 1. 1. 1.]]

Однако дляциклы довольно медленные, и я хотел бы знать, есть ли способ сделать это более эффективным.

Редактировать: ввод не всегда np.ones((5,7)), это будет вообще что-то более неоднородное.

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Вот код вопроса.

import numpy as np 
a=np.random.randn(5, 7)
a1=a
a2=a
mid_mat= a[1:, :][:, :-1]+a[:, :-1][:-1, :]
a1[1:-1, 1:-1] = mid_mat[:-1, :-1]

# Assert Code

for i in range(1,a.shape[0]-1):
    for j in range(1,a.shape[1]-1):
        a2[i,j]=a[i+1,j]+a[i,j+1]

np.testing.assert_array_equal(a1, a2)
0 голосов
/ 09 июня 2018

Если вы рисуете рамку вокруг «внутренних» элементов, ваш код устанавливает новое значение этих элементов равным сумме (а) того, что поле «сдвинуто на одну строку вниз», и (б) этого поля «смещение»один столбец справа ".

Например:

-----     -----     -----
-XXX-     -----     --XXX
-XXX-  =  -XXX-  +  --XXX
-XXX-     -XXX-     --XXX
-----     -XXX-     -----

И вы можете сделать это без петель следующим образом:

arr[1:-1,1:-1] = arr[2:,1:-1] + arr[1:-1,2:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...