1
votes

Comment découper en partant d'un indice négatif à un indice positif ou l'inverse

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]


4 commentaires

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 () et np.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.


3 Réponses :


0
votes
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. 

2 commentaires

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.



0
votes

É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


1 commentaires

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.



1
votes
In [77]: np.arange(10)[-2:2]                                                                           
Out[77]: array([], dtype=int64)

1 commentaires

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.