2016-07-01 19 views
2

Ich benutze Python 2.7, um ein komplexwertiges (mxn) -dimensionales Array ohne eine anfänglich bekannte feste Größe (dh m und n sind nicht vor der Zeit bekannt) zu erstellen bestimmten Elementen werden unterschiedliche Werte zugewiesen. Daher werde ich an diesem Array an beliebigen Positionen, die in der Zukunft spezifiziert werden, bestehende Elemente ändern oder neue Elemente hinzufügen.Element an beliebiger Position eines n-dimensionalen Arrays einfügen

Im Allgemeinen möchte ich eine anfängliche Anordnung vorgeschriebener Größe in ein (m x n) -dimensionales Array transformieren. Zum Beispiel, wenn ich anfangen mit

[ 0.+0.j 0.+0.j 0.+0.j] 
[ 0.+0.j 0.+0.j 0.+0.j] 

Ich mag es aktualisieren, entweder Fall 1 Fall 2 zu ergeben, oder Fall 3 (je nachdem, welche entscheiden, ich zu wählen?). Im Wesentlichen möchte ich nur eine null Zeile oder Spalte (oder beide) zum ursprünglichen Array hinzufügen.

Fall 1:

[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j] 
[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j] 

Fall 2:

[ 0.+0.j 0.+0.j 0.+0.j] 
[ 0.+0.j 0.+0.j 0.+0.j] 
[ 0.+0.j 0.+0.j 0.+0.j] 

Fall 3:

[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j] 
[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j] 
[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j] 

Bei einem ähnlichen Ansatz wie oben, sondern np.insert verwendet, kann ich reproduzieren, was ich will von:

import numpy as np 
T = np.zeros((2,3),dtype=np.complex_) 
T = np.insert(T,len(T[0]),1,axis = 1) 

oder

T = np.zeros((2,3),dtype=np.complex_) 
T = np.insert(T,len(T[:,0]),1,axis = 0) 

Mit dieser Methode kann ich spielen, um Fall zu erreichen, 1, 2, oder 3, aber gibt es eine besonders effiziente Methoden?

Die Einschränkungen bestehen wiederum darin, dass ein Objekt mit Elementen vom Typ complex verwendet werden muss, da diese Einträge in weiterer Arithmetik verwendet werden. Ich könnte den realen und komplexen Teil der Elemente trennen und zwei weitere Listen erstellen, aber mathematische Operationen müssten immer noch auf sie angewendet werden. Außerdem kann das endgültige Array Werte von m und n (stark) über 1000 haben. (Die endgültige erforderliche Größe des Arrays wird erst am Ende des Codes bekannt sein.)

Irgendein Einblick in die Lage hinzuzufügen Null Zeilen oder Spalten zu einem anfänglichen Array in einer effizienteren Weise wäre groß.

+0

Sie möchten vielleicht überhaupt kein Array verwenden. NumPy-Arrays sind für diese Art von Verwendung überhaupt nicht geeignet. Erwägen Sie, ein Diktat oder etwas zu verwenden. – user2357112

+0

Das scheint ich zu lesen. Der Hauptgrund für die Verwendung eines Arrays besteht darin, dass die Einträge komplexwertig sein und in weiteren mathematischen Operationen verwendet werden müssen. Ich könnte die Werte in einen realen und komplexen Teil aufteilen und zwei getrennte Listen erstellen, aber die Notwendigkeit, weiterhin an diese Listen anzuhängen und Operationen (z. B. trigonometrische/hyperbolische Funktionen, Potenzieren, Graphen) an diesen Elementen durchzuführen, würde immer noch bestehen bleiben. – Mathews24

+0

Es gibt nichts, was Sie davon abhält, komplexe Zahlen in Listen oder Diktate zu setzen. – user2357112

Antwort

0

Versuchen Sie folgendes:

np.concatenate((T, np.zeros((1,T.shape[1]), dtype=np.complex_)), axis=0) 

und

np.concatenate((T, np.zeros((T.shape[0],1), dtype=np.complex_)), axis=1) 
0

Ich würde vorschlagen, den Code für np.insert studieren. Es ist Python. Wenn es komplex ist, ist es einfach, weil es versucht, allgemein zu sein, Zeilen oder Spalten usw. handhabend.

Die Grundidee ist, ein neues Ergebnis-Array der richtigen Größe zu machen, und dann Blöcke von Werten aus dem Original zu kopieren das Ergebnis. In 1d, die so etwas wie sein würde:

z = np.zeros(x.shape[0]+1, dtype=x.dtype) 
z[:i] = x[:i] 
z[i+1:] = x[i:] 

, die leicht auf das Hinzufügen einer Zeile in einem 2d verallgemeinert werden kann (z[:i,...] könnte alles sein, was benötigt wird).

Um eine Spalte sowie eine Zeile hinzuzufügen, kann ich mir vorstellen, 4 Blöcke zu kopieren.

Es ist auch möglich, Verkettung zu verwenden (die eine ähnliche Art von Blockkopie in kompiliertem Code ausführt).

np.concatenate([x[:i],np.array([0]), x[i:]]) 

np.insert könnte sein, einfacher zu bedienen, aber die eine oder andere Sie tun, diese Art von Blockkopie am Ende. Wenn Sie nur Zeilen oder Spalten (oder beides) hinzufügen möchten, können Sie np.pad verwenden. Das ist sehr allgemein und erlaubt Additionen an der Front und am Ende in jeder Dimension. np.insert ist nützlicher, wenn Sie den/die neuen Werte irgendwo in der Mitte des Arrays hinzufügen möchten.

Verwandte Themen