Для этого X
:
In [734]: X = np.arange(24).reshape(8,3)
In [735]: X.strides
Out[735]: (24, 8)
this as_strided
создает тот же массив, что и ваш time_framer
In [736]: np.lib.stride_tricks.as_strided(X,
shape=(X.shape[0]-3, 3, X.shape[1]),
strides=(24, 24, 8))
Out[736]:
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]],
[[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[12, 13, 14],
[15, 16, 17],
[18, 19, 20]]])
Он идет по последнему измерению, как и X
. И со второго до последнего. Первый продвигается на одну строку, поэтому он тоже получает X.strides[0]
. Таким образом, размер окна влияет только на форму, а не на шаги.
Так что в вашей as_strided
версии просто используйте:
new_strides = (data_to_frame.strides[0],
data_to_frame.strides[0] ,
data_to_frame.strides[1])
Незначительные исправления. Установите размер окна по умолчанию 2 или больше. 1 приводит к ошибке индексации в тесте.
framed_data[0,1]==framed_data[1,0]
Глядя getsizeof
:
In [754]: sys.getsizeof(X)
Out[754]: 112
In [755]: X.nbytes
Out[755]: 192
Подождите, почему размер X
меньше nbytes
? Потому что это view
(см. Строку [734] выше).
In [756]: sys.getsizeof(X.copy())
Out[756]: 304
Как отмечено в другом SO, getsizeof
следует использовать с осторожностью:
Почему размер массива numpy отличается?
Теперь для расширенной копии:
In [757]: x2=time_framer(X,4)
...
In [758]: x2.strides
Out[758]: (96, 24, 8)
In [759]: x2.nbytes
Out[759]: 384
In [760]: sys.getsizeof(x2)
Out[760]: 512
и пошаговая версия
In [761]: x1=strides_trick_time_framer(X,4)
...
In [762]: x1.strides
Out[762]: (24, 24, 8)
In [763]: sys.getsizeof(x1)
Out[763]: 128
In [764]: x1.astype(int).strides
Out[764]: (96, 24, 8)
In [765]: sys.getsizeof(x1.astype(int))
Out[765]: 512
x1
размер такой же, как вид (128, потому что его 3d). Но если мы попытаемся изменить его dtype
, он сделает копию, и шаги и размер будут такими же, как у x2
.
Многие операции на x1
потеряют преимущество по размеру, x1.ravel()
, x1+1
и т. Д. В основном операции сокращения, такие как mean
и sum
, дают реальную экономию пространства.