2017-04-10 2 views
3

Ich versuche, eine numpy.array der Länge 40 in kleinere, gleich große numpy.array s zu teilen, in denen die Anzahl der kleineren Arrays vom Benutzer angegeben wird. Es ist zulässig, eine gewisse Überlappung zwischen den kleineren Arrays zu haben, da Situationen auftreten können, bei denen die volle Länge nur durch die Teilungen teilbar ist, die durch eine Art von Überlappung der kleineren Arrays gegeben sind.Split-Array in gleich große Fenster

Wenn ich ein Array np.array([range(40)]) hatte, und ich hatte es in 37 Subarrays aufgeteilt, sollte die Liste der Sub-Arrays so aussehen:

[1, 2, 3], [3, 4, 5], [5, 6, 7], ... [38, 39, 40] 

ich versucht, mit numpy.split Das funktioniert aber nur, wenn die Länge durch die Größe teilbar, und numpy.array_split erzeugt ungleichmäßige Größen.

Beispiel numpy.split

>> import numpy as np 
>>> a = np.random.randint(6,size=(40)) 
>>> b = np.split(a,37) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/site-packages/numpy/lib/shape_base.py", line 508, in split 
    'array split does not result in an equal division') 
ValueError: array split does not result in an equal division 

Und mit numpy.array_split

>>> a = np.random.randint(5,size=(40)) 
>>> b = np.array_split(a,37) 
>>> print len(b) 
37 
>>> print b[0].shape 
(2,) 
>>> print b[3].shape 
(1,) 
>>> print b[5].shape 
(1,) 
>>> print b[6].shape 
(1,) 
>>> print b[30].shape 
(1,) 
>>> 

numpy.array_split nicht gleichmäßig teilen sie mit.

Irgendeine Lösung?

+1

Im Gegenteil: Diese Funktionen tun genau das, was Sie sagen, dass sie nicht tun. Zeigen Sie uns die Ausgabe, die Sie erhalten, und die gewünschte Ausgabe. –

+0

hinzugefügt ein Beispiel gegeben 'numpy.split' – Somthin

+1

' array_split's Dokumentation sagt, dass es ungleiche Aufteilungen handhabt; 'Split' wurde entwickelt, um einen Fehler zu erzeugen. –

Antwort

2

Was Sie beschreiben, ist ein (gleitendes) Fenster, kein Split.

Siehe diese Antwort: https://stackoverflow.com/a/15722507/7802200

Was Sie wollen, ist die window_stack Funktion dort mit einem width von len(a) - n_splits + 1 entwickelt zu verwenden.

+0

ahh. das macht Sinn .. Schiebefenster .. dann brauche ich nur eine Möglichkeit, wie ich den Schritt bestimmen kann .. so dass es mit der Anzahl der Sub-Arrays übereinstimmen Ich möchte – Somthin

+0

Ich denke, dass ich das im letzten Teil meiner Antwort adressiere. In deiner Frage hast du gesagt, ein Array von 40 mit 37 Untergruppen sollte dir eine Breite von 3 ergeben, aber es muss tatsächlich 4 sein. Es ist 'len (a) - n_groups + 1'. –

0

numpy.split() sollten gleich große Sub-Arrays von genau der Größe erzeugen, die im Parameter indices_or_sections angegeben ist, der der zweite Eingang der Funktion ist. Wie haben Sie versucht, die Split-Funktionen zu verwenden? Wenn Sie das Array arr in 4 Sub-Arrays der Größe 5, teilen möchten

numpy.split(arr,4) 

Der Grund Ihr Beispiel fehlgeschlagen ist verwenden, dass die Array-Größe durch die Anzahl der Arrays teilbar sein muss, die Sie wollen. Das ist sinnvoll, da Sie nur dann in gleiche Größen aufteilen können, wenn die Anzahl der Elemente geteilt durch die Anzahl der Unterfelder eine Ganzzahl ist.

Jetzt, da Sie Ihre Frage geklärt haben, denke ich, dass es keine einfache Lösung gibt. Es ist einfach, das Array in gleich große Gruppen zu unterteilen. Wenn der Benutzer jedoch 37 gleich große Gruppen aus einer Gruppe von 40 mit Überlappung anfordert, gibt es mehr als eine Möglichkeit, dies zu tun, und Sie haben uns keine Kriterien zur Bestimmung gegeben Methoden, um Ihnen zu helfen. Es gibt keine einfache numpy Funktion für die Aufgabe, nach der Sie suchen. Sie benötigen einen Suchalgorithmus (DFS?), Um herauszufinden, wie Sie die Menge in 37 (oder was auch immer gewünscht wird) gleich große Gruppen teilen.

+0

Ich möchte nicht die Größe des Arrays angeben .. Ich möchte nur die Anzahl der Subarrays, die ich will. – Somthin

+0

Und nicht teilbar sein.Überlappungen sind erlaubt. Also sollte es teilbar sein. – Somthin

+0

Ich habe nie gesagt, dass Sie die Größe des Arrays angeben müssen, und ich sehe den Teil über Überlappung jetzt und denke, dass Sie einen Suchalgorithmus dafür benötigen. –

Verwandte Themen