Numpy ne peut pas effectuer l'indexation suivante:
def slicer(array, lower_, upper_):
n = len(array)
lower_ = lower_ % n # if negative, you get the positive equivalent. If > n, you get principal value.
roll = lower_
lower_ = lower_ - roll
upper_ = upper_ - roll
array_ = np.roll(array, -roll)
upper_ = upper_ % n
return array_[lower_: upper_]
Je le fais d'une manière pas très élégante pour le moment, y a-t-il une astuce ou une ligne pour l'obtenir?
EDIT: Notez que je ne sais pas si je suis confronté à ce scénario dans mon code, cela arrive parfois, donc je recherche une solution dynamique et unique, pas quelque chose pour ce cas précis uniquement.
MODIFIER: Mon slicer généralisé, assez long.
a = np.arange(10) a[-2: 2]
3 Réponses :
def slicer(a, lower, upper):
if lower < 0:
return np.concatenate((a[lower:], a[:upper]))
else:
return a[lower: upper]
I think it's relatively simple.
Cela fait. Dans ce cas, il est équivalent à np.arange (10) [8: -2] et renvoie [] .
Le faire fonctionner pour a [8: 2] est quelque chose de différent de ce que vous avez demandé dans la question. np.arange (10) [8: 2] renvoie un tableau vide (identique dans mon code) et vous n'avez pas indiqué que votre résultat attendu est différent.
Étant donné que vous connaissez la longueur, vous pouvez simplement ajouter la longueur de votre tableau aux valeurs inférieure et supérieure si elles sont <0. Vous pouvez alors vérifier si supérieur est plus petit que inférieur, et concaténer si nécessaire.
XXX
Une chose qui est un peu étrange à ce sujet, c'est que le bas et le haut sont tous les deux négatifs, mais inférieurs> supérieurs. Dans ce cas, vous enroulez tout le tableau, ce qui est attendu, mais toujours un peu bizarre.
In [77]: np.arange(10)[-2:2] Out[77]: array([], dtype=int64)
Merci. J'attendais votre réponse. Je connais toutes ces subtilités que vous avez mentionnées. np.r_ semble résoudre la moitié du problème, comme lorsque vous sautez d'indices négatifs à positifs lors du découpage. Mais cela ne fonctionne certainement pas pour a [8: 2] où a a une taille de 10. Dans ce cas, il y a saut d'un autre fin du tableau à son début. D'accord, alors vous suggérez que je devrais le gérer manuellement comme une exception. Merci.
Ne pouvez-vous pas simplement dire: a [-2:] + a [: 2]
@PeterPesch Premièrement, vous supposez que Python ne répertorie pas les tableaux numpy, + ajoute ne concatène pas. Deuxièmement, oui, bien sûr, mais je ne sais pas où / quand cela va se passer dans mon programme pour que je fasse cette astuce.
b = a.tolist ()etnp.array (b [-2:] + b [: 2])est une solution sur 2 lignes@rpoleski Merci, mais je ne sais pas si c'est effectivement le cas. c'est-à-dire que je ne sais pas si je suis confronté à un tel scénario en premier lieu, donc je veux qu'il soit dynamique et fonctionne pour tous les cas. Je mettrai à jour la question pour que ce soit clair.