Я пытаюсь использовать функцию as_strided
из numpy.lib.stride_tricks
для извлечения подсерий из большего 2D-массива, но я изо всех сил пытался найти правильную запись для аргумента strides
.
Допустим, у меня есть матрица m
, которая содержит 5 одномерных массивов длиной (a=
)10. Я хочу извлечь вспомогательные 1D-массивы длиной (b=
)4 для каждого 1D-массива в m
.
import numpy
from numpy.lib.stride_tricks import as_strided
a, b = 10, 4
m = numpy.array([range(i,i+a) for i in range(5)])
# first try
sub_m = as_strided(m, shape=(m.shape[0], m.shape[1]-b+1, b))
print sub_m.shape # (5,7,4) which is what i expected
print sub_m[-1,-1,-1] # Some unexpected strange number: 8227625857902995061
# second try with strides argument
sub_m = as_strided(m, shape=(m.shape[0], m.shape[1]-b+1, b), strides=(m.itemize,m.itemize,m.itemize))
# gives error, see below
AttributeError: объект «numpy.ndarray» не имеет атрибута «itemize»
Как видите, мне удалось получить правильную форму для sub_m
с первой попытки. Однако я не могу найти, что написать в strides=()
Для информации:
m = [[ 0 1 2 3 4 5 6 7 8 9]
[ 1 2 3 4 5 6 7 8 9 10]
[ 2 3 4 5 6 7 8 9 10 11]
[ 3 4 5 6 7 8 9 10 11 12]
[ 4 5 6 7 8 9 10 11 12 13]]
Ожидаемый результат:
sub_n = [
[[0 1 2 3] [1 2 3 4] ... [5 6 7 8] [6 7 8 9]]
[[1 2 3 4] [2 3 4 5] ... [6 7 8 9] [7 8 9 10]]
[[2 3 4 5] [3 4 5 6] ... [7 8 9 10] [8 9 10 11]]
[[3 4 5 6] [4 5 6 7] ... [8 9 10 11] [9 10 11 12]]
[[4 5 6 7] [5 6 7 8] ... [9 10 11 12] [10 11 12 13]]
]
изменить: у меня гораздо больше данных, поэтому я хочу использовать as_strided
(эффективность)
L
. - person Divakar   schedule 01.06.2017