Numpy 1d array zu 2d array durch Slicing, warum klappts nicht?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Bayne
User
Beiträge: 40
Registriert: Freitag 31. Mai 2019, 16:28

Hey liebe Forum User,

Ich versuche bereits seid Stunden eine Lösung zu finden:

Ich habe:
eine liste (kann ruhig auch zu np.array umgewandelt werden wenns schneller geht) & 2 np.arrays (aus Integern welche ich als Index verwenden will) .
für jedes Element in meinen werten soll ein Slice von Wert[start] bis Wert[end] erstellt werden. So klappts:

Code: Alles auswählen

import numpy as np
result = [    werte[ start: end]    for    start,end    in    zip(start_ix, end_Ix) ]  
Nun sollte das ganze aber aus Performance gründen mit numpy vektorisiert werden. Da fromiter nur 1d-arrays erstellt habe ich nur folgenden Ansatz finden können:

Code: Alles auswählen

from itertools import chain
result = [    np.fromiter(    chain.from_iterable(   werte[ start: end]    for   start,end   in    zip(start_ix, end_Ix)    )   , '1',-1)   ]  
Das klappt leider nicht. bekomme nur ein leeres Array.

Was kann ich stattdessen tun?
Oder warum klappt es nicht

Vielen Dank und bleiben Sie gesund.
Bayne
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Also der Abstand von Start zu End ist immer gleich? Sonst wird das ja kein 2d-Array.
Können sonst die Start-Indexe beliebig sein, oder gibt es da auch eine Regelmäßigkeit?
Das from-iter macht in der Geschwindigkeit keinen Unterschied.

Wie sehen die Arrays genau aus, von welchen Größen reden wir hier? Wie hast Du das Erstellen gebenchmarkt und welche Operation ist Dir dabei zu langsam?
Bayne
User
Beiträge: 40
Registriert: Freitag 31. Mai 2019, 16:28

Sirius3 hat geschrieben: Freitag 17. April 2020, 10:58 Also der Abstand von Start zu End ist immer gleich? Sonst wird das ja kein 2d-Array.
Können sonst die Start-Indexe beliebig sein, oder gibt es da auch eine Regelmäßigkeit?
Das from-iter macht in der Geschwindigkeit keinen Unterschied.

Wie sehen die Arrays genau aus, von welchen Größen reden wir hier? Wie hast Du das Erstellen gebenchmarkt und welche Operation ist Dir dabei zu langsam?
Abstand von Start zu End variiert, Start Indizes sind Zeitwerte (mit Lücken) genauso die End Indizes, also keine Regelmäßigkeit
ArrayGrößen sind nach oben offen bis in die millionenlänge
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie soll dann daraus ein 2d-Array werden?
Bayne
User
Beiträge: 40
Registriert: Freitag 31. Mai 2019, 16:28

@Sirius3
Zitat:
So klappts:

Code: Alles auswählen

import numpy as np
result = [    werte[ start: end]    for    start,end    in    zip(start_ix, end_Ix) ] 
start und end sind Integer.
nur Werte ist eine Zeitreihe, falls ich mich unverständlich ausgedrückt hab.

für jede Reige in den Indizes zip(start_ix, end_Ix) will ich einen Slice der von "start" bis "end" geht ( wobei es sich um ints aus zip(start_ix, end_Ix) handelt).
Das klappt ja So wie ich es oben geschrieben habe (als List comprehension).

Nur leider klappts nicht als Numpy version mit bspw. fromiter().
Bevor jmd was sagt. JA ich weiß dass fromiter nur 1d-Arrays erstellen kann, deshalb suche ich ja nach einer Alternative die diese Listcomprehension in schnelleren Numpy code umwandeln kann.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Und wie ich schon geschrieben habe, wird das nicht schneller gehen.
Daher nochmal die Frage: wie hast Du gemessen, was wieviel Zeit braucht, und welche Operation ist Dir zu langsam.
Um dann weiter helfen zu können, braucht man auch ein sehr konkretes Beispiel.
Antworten