Если у вас есть доступ к непрерывному массиву, из которого получен ваш несмежный массив, обычно должно быть возможно обойти это ограничение.
Например, ваши триграммы могут быть получены так:
>>> a = np.random.randint(0, 256, 2**28, 'B').view('c')
>>> a
array([b')', b'\xf2', b'\xf7', ..., b'\xf4', b'\xf1', b'z'], dtype='|S1')
>>> np.lib.stride_tricks.as_strided(a[:0].view('S3'), ((2**28)-2,), (1,))
array([b')\xf2\xf7', b'\xf2\xf7\x14', b'\xf7\x14\x1b', ...,
b'\xc9\x14\xf4', b'\x14\xf4\xf1', b'\xf4\xf1z'], dtype='|S3')
Фактически, этот пример демонстрирует, что все, что нам нужно, - это непрерывная «заглушка» в основании буфера памяти для приведения к просмотру, поскольку впоследствии, поскольку as_strided
не делает много проверок, мы, по сути, свободны делатьвсе, что нам нравится.
Кажется, что мы всегда можем получить такую заглушку, нарезав массив размером 0.Для вашего второго примера:
>>> X = np.empty((8, 4), 'uint32')[:, :2]
>>> np.lib.stride_tricks.as_strided(X[:0].view(np.uint64), (8, 1), X.strides)
array([[140133325248280],
[ 32],
[ 32083728],
[ 31978800],
[ 0],
[ 29686448],
[ 32],
[ 32362720]], dtype=uint64)