1
votes

Fenêtre déroulante sur un tableau 2D avec un espacement spécifique le long d'une dimension

Je comprends que des questions similaires ont déjà été publiées ici, mais je n'arrive pas à np.lib_stride_tricks.as_strided comment fonctionne np.lib_stride_tricks.as_strided . Je voudrais savoir s'il existe une fonction numpy qui me permet de faire le mappage suivant de a -> b efficacement:

import numpy as np

a = np.random.rand(100000,3)

window_length = 200;
spacing = 20;

b = []

for i in range(0,a.shape[0] - window_length,spacing):
    b.append(a[i:i+window_length,:])

b = np.asarray(b);
print(b.shape)

Quelles sorties (4490,200,3) .


2 commentaires

Notez que pour utiliser l'étendue complète, utilisez for i in range(0,a.shape[0] - window_length+1,spacing):


Tous les tableaux numpy sont stockés dans des segments de mémoire contigus et linéaires. strides définissent essentiellement le saut que vous faites le long de chaque dimension des données, pour obtenir l'illusion d'un tableau multidimensionnel. Dites si le tableau est [1, 2, 3, 4] et que vous définissez les sauts le long des axes x et y comme 1 et 2, alors le tableau 2D virtuel serait [ [1, 2], [3, 4] ] . Notez que le long des lignes, les éléments (disons 1 et 2) sont stockés de manière contiguë, tandis que le long des colonnes, vous devez sauter 2 emplacements dans le tableau d'origine pour accéder à l'élément (1 et 3).


3 Réponses :


2
votes

Nous pouvons exploiter np.lib.stride_tricks.as_strided basé sur np.lib.stride_tricks.as_strided scikit-image's view_as_windows pour obtenir des vues fenêtrées glissantes et ainsi résoudre notre problème ici de manière vectorisée.

from skimage.util.shape import view_as_windows
w = view_as_windows(a, (window_length,1), step=(spacing,1))[...,0]

# If needed, get into desired permuted axes format
out = w.swapaxes(1,2)

Plus d'informations sur l'utilisation de as_strided basé sur view_as_windows . Si scikit-image n'est pas disponible, nous pouvons directement utiliser le source code qui fonctionne de manière autonome.


0 commentaires

0
votes

Une utilisation directe de as_strided :

strides = a.strides

new_len = (a.shape[0]-window_length+1)//spacing

b = as_strided(a,shape=(new_len,window_length, a.shape[1]),
               strides=(strides[0]*spacing,) + strides)


0 commentaires

0
votes

Pour générer votre tableau à l'aide de stride_tricks, procédez comme suit:

from numpy.lib.stride_tricks import as_strided as stride

d0, d1 = a.shape
s0, s1 = a.strides
b2 = stride(a,
    ((d0 - window_length + 1) // spacing, window_length, d1),
    (s0 * spacing, s0, s1))

J'ai délibérément choisi un nom de tableau différent ( b2 ).

Pour vérifier que mon code donne un résultat correct:

  • générer un tableau b en utilisant votre code,
  • comparez les deux tableaux exécutant np.array_equal(b, b2) .

Le résultat doit être vrai .


0 commentaires