сдвинуть numy вектор n раз и создать матрицу - PullRequest
0 голосов
/ 07 ноября 2018

Я ищу способ сдвинуть np.array длины n, n-1 раз и создать матрицу из сдвинутых векторов.

Например, если это мой вектор:

[1,4,7,8]

То, что я хочу получить:

[[None, None, None],
 [1   , None, None],
 [4   , 1   , None],
 [7   , 4   , 1   ]]

Я могу легко сделать это с помощью цикла for и shift, но мне было интересно, есть ли более эффективный способ с помощью встроенной функции numpy.

1 Ответ

0 голосов
/ 07 ноября 2018

Вот один с np.lib.stride_tricks.as_strided -

def shifted_subarrays(a, fill=None):
    a = np.asarray(a)
    fillar = np.full(len(a)-1, fill)
    a_ext = np.concatenate((fillar,a))
    n = len(a)
    s = a_ext.strides[0]
    strided = np.lib.stride_tricks.as_strided
    return strided(a_ext[len(a)-2:], shape=(n,n-1), strides=(s,-s))

Пробный прогон -

In [20]: a = [1,4,7,8]

In [21]: shifted_subarrays(a)
Out[21]: 
array([[None, None, None],
       [1, None, None],
       [4, 1, None],
       [7, 4, 1]], dtype=object)

In [46]: shifted_subarrays(a, fill=np.nan)
Out[46]: 
array([[nan, nan, nan],
       [ 1., nan, nan],
       [ 4.,  1., nan],
       [ 7.,  4.,  1.]])

Более простой с toeplitz -

from scipy.linalg import toeplitz
out = toeplitz(a,[None]*(len(a)))[:,1:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...