Numpy Векторизация: добавить строку выше к текущей строке на ndarray - PullRequest
0 голосов
/ 09 февраля 2020

Я хотел бы добавить значения в строке выше в строку ниже, используя векторизацию. Например, если бы у меня был ndarray,

[[0, 0, 0, 0],
 [1, 1, 1, 1],
 [2, 2, 2, 2],
 [3, 3, 3, 3]]

Тогда после одной итерации этого метода это привело бы к

[[0, 0, 0, 0],
 [1, 1, 1, 1],
 [3, 3, 3, 3],
 [5, 5, 5, 5]]

Можно просто сделать это с помощью a для l oop:

import numpy as np

def addAboveRow(arr):
    cpy = arr.copy()

    r, c = arr.shape
    for i in range(1, r):
        for j in range(c):
            cpy[i][j] += arr[i - 1][j]

    return cpy

ndarr = np.array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]).reshape(4, 4)
print(addAboveRow(ndarr))

Я не уверен, как подойти к этому, используя векторизацию. Я думаю, что слайсеры должны быть использованы? Кроме того, я не совсем уверен, как бороться с проблемой верхней границы, потому что ничего не должно быть добавлено в первый ряд. Любая помощь будет оценена. Спасибо!

Примечание: я действительно новичок в векторизации, поэтому объяснение было бы здорово!

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Вы можете использовать индексирование напрямую:

b = np.zeros_like(a)
b[0] = a[0]
b[1:] = a[1:] + a[:-1]
>>> b
array([[0, 0, 0, 0],
       [1, 1, 1, 1],
       [3, 3, 3, 3],
       [5, 5, 5, 5]])

Альтернатива:

b = a.copy()
b[1:] += a[:-1]

Или:

b = a.copy()
np.add(b[1:], a[:-1], out=b[1:])
0 голосов
/ 10 февраля 2020

Вы можете попробовать следующее

np.put(arr, np.arange(arr.shape[1], arr.size), arr[1:]+arr[:-1])
...