Seite 1 von 1

Mit numpy teile eines Arrays kopieren?

Verfasst: Montag 7. November 2011, 15:44
von Arp
Hallo,

Ich steh grad auf dem Schlauch.

Nehmen wir als beispiel folgendes array:

1,2,3,
4,5,6
7,8,9

nun möchte ich eine Liste anlegen, die alle arrayelemente die auf einem Umfang liegen enthält. Z.b will ich den Umfang mit abstand 1 um die 5 haben. Also wären das in diesem Fall die 1,2,3,4,6,7,8,9. Ich hoffe ihr versteht was ich meine.

Nun könnte man das relativ einfach mittels 2 for schleifen lösen. Wenn man das Array aber nun richtig groß macht, wird das richtig langsam.
Wie geht das noch besser?

ich dachte an etwas wie liste = [i for i in array[][]] oder so... aber ich krieg da keine vernünftige syntax auf die reihe.

Re: Mit numpy teile eines Arrays kopieren?

Verfasst: Montag 7. November 2011, 16:19
von BlackJack
@Arp: Man könnte so vorgehen: den Block mit der 5 in der Mitte und dem gewünschten Umfang raus-„slicen“, `flatten()`, und dann die beiden Teile vor und nach der 5, die ja auch im „flach geklopften“ Array noch genau in der Mitte steht, nehmen.

Re: Mit numpy teile eines Arrays kopieren?

Verfasst: Montag 7. November 2011, 16:23
von Arp
Hmm,

Aber sobald das Array größer wird, kann man nicht mehr so einfach den Mittelteil raus nehmen.

Re: Mit numpy teile eines Arrays kopieren?

Verfasst: Montag 7. November 2011, 16:25
von jbs
Du musst schon die Spaltenbreite kennen. Dann sollte das doch nicht so schwer sein.

Re: Mit numpy teile eines Arrays kopieren?

Verfasst: Montag 7. November 2011, 16:32
von BlackJack
@Arp: Was meinst Du mit Mittelteil? Wenn die Zahl, die Du nicht im Ergebnis haben möchtest im Original in der Mitte von dem Quadrat steht, dann sollte sie das auch immer im ausgeschnittenen und flach geklopften Array tun. Umständlicher wird es erst wenn der Mittelpunkt näher am Rand liegt als der Umfang sein soll. Aber da hast Du ja sowieso nicht spezifiziert was passieren soll.

Re: Mit numpy teile eines Arrays kopieren?

Verfasst: Montag 7. November 2011, 20:44
von Arp
Die Spaltenbreite ist immer 1.

z.b. das array:

1 1 1 1 1 1
1 2 2 2 2 1
1 2 3 3 2 1
1 2 3 3 2 1
1 2 2 2 2 1
1 1 1 1 1 1

Ich will da z.b. nun ein Rechtreck quasi raus kopieren das nur aus den 2'en besteht, oder nur aus den 1en. Das meine ich mit Umfang. Eben ein 1 Spaltiges rechteck. Und wenn man da das flatten macht, kann man glaub ich nicht mehr so einfach was aus der Mitte rausholen weil man dafür dann auch die gesamtdimension des arrays kennen muss.
Wenns an den Rand geht soll nur ein Rechteck gewählt werden das maximal eben nur bis Rand geht, aber das hab ich schon mit ner Einfachen if abfrage behandelt.

Re: Mit numpy teile eines Arrays kopieren?

Verfasst: Montag 7. November 2011, 21:01
von BlackJack
@Arp: Ah, okay das war mir aus Deiner ersten Beschreibung so nicht klar. Aber man muss doch eigentlich nur vier Zugriffe auf das Array machen um jeweils den oberen, unteren, rechten, und linken „Rahmenteil“ dort heraus zu holen.

Re: Mit numpy teile eines Arrays kopieren?

Verfasst: Montag 7. November 2011, 21:17
von Arp
Ja, mittels 2 for schleifen lässt sich das sehr einfach lösen. Ich hatte halt nur gehofft das es einen schnelleren weg gibt.

Ich hatte nämlich (leider) erst neulich entdeckt das numpy funktionen viel schneller sind als eine doppelforschleife... z.b. hatte ich ne funktion um einen bestimmten wert in einem array zu suchen.
Hab das so implementiert das ich eine doppelte for schleife hatte, und einfach alle durchgegangen bin. Wenn der gefundene Wert da war, wurde es raus geschrieben.
Bei einem Testarray dauerte das ganze ca. 90 sekunden.

mit numpy.where() dauerte das ganze ca. 0.6 sekunden.

Re: Mit numpy teile eines Arrays kopieren?

Verfasst: Montag 7. November 2011, 22:39
von BlackJack
@Arp: Ohne ``for``-Schleifen in Python! Du brauchst doch nur exakt vier Arrayzugriffe die jeweils die Werte oben, unten, rechts, und links erfassen, egal wie gross das Array ist. Wozu brauchst Du da eine Schleife? Beziehungsweise auch noch zwei!?