У меня есть 1D-массив, который я хочу преобразовать в 2D-массив, где в строке i исходный 1D катится по шагам i . Я реализовал это следующим образом:
import numpy as np
data=np.arange(0,10,2)
rolling=np.arange(len(data))
array=np.array([np.roll(data,-i) for i in rolling])
array
array([[0, 2, 4, 6, 8],
[2, 4, 6, 8, 0],
[4, 6, 8, 0, 2],
[6, 8, 0, 2, 4],
[8, 0, 2, 4, 6]])
. Для более поздних целей я бы хотел, чтобы скатывание происходило таким образом, чтобы массив не переворачивался через край, а соответствующие значения заменялись чем-то другим, например np.nan
.
Мой предполагаемый вывод -
array([[0, 2, 4, 6, 8],
[2, 4, 6, 8, np.nan],
[4, 6, 8, np.nan, np.nan],
[6, 8, np.nan, np.nan, np.nan],
[8, np.nan, np.nan, np.nan, np.nan]])
Данные не обязательно являются такими же однородными, как в этом примере, поэтому обнаружение края невозможно, как это было бы в пример. Я пробовал использовать отступы, но они не являются ни короткими, ни удобными, поскольку в каждом ряду требуется разный отступ. Кроме того, я думал о np.tril
или np.triu
, но они работали только для главной диагонали, но уклон не по главной диагонали. В этом примере он находится на противоположной диагонали, но в реальном примере это может измениться, что будет выглядеть так:
array=np.array([np.roll(data,-i+manualshift) for i in rolling])
РЕДАКТИРОВАТЬ: Дополнительный пример
Если я введу матрицу большего размера и добавлю дополнительный сдвиг, как этот
data=np.arange(0,20,2)
rolling=np.arange(len(data))
manualshift=3
array=np.array([np.roll(data,-i+manualshift) for i in rolling])
, тогда массив будет выглядеть так:
array([[nan, nan, nan, 0, 2, 4, 6, 8, 10, 12],
[nan, nan, 0, 2, 4, 6, 8, 10, 12, 14],
[nan, 0, 2, 4, 6, 8, 10, 12, 14, 16],
[ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18],
[ 2, 4, 6, 8, 10, 12, 14, 16, 18, nan],
[ 4, 6, 8, 10, 12, 14, 16, 18, nan, nan],
[ 6, 8, 10, 12, 14, 16, 18, nan, nan, nan],
[ 8, 10, 12, 14, 16, 18, nan, nan, nan, nan],
[10, 12, 14, 16, 18, nan, nan, nan, nan, nan],
[12, 14, 16, 18, nan, nan, nan, nan, nan, nan]])
EDIT END
Есть краткое решение для этого?