2017-07-12 9 views
2

Ich versuche, jede Spalte einer nach dem anderen von einem Array zu entfernen, und auf der Grundlage der Dokumentation und this question, dachte der folgenden funktionieren sollte:numpy.delete nicht Spalte aus dem Array entfernt

print(all_input_data.shape) 

for n in range(9): 
    print(n) 
    testArray = all_input_data.copy() 
    print(testArray.shape) 
    np.delete(testArray,[n],axis=1) 
    print(testArray.shape) 
    print(testArray[0:1][:]) 

Das Original Matrix ist all_input_data.

Dadurch werden keine Spalten gelöscht oder andere Änderungen am Array generiert. Die ursprüngliche Ausgabe für das obige Snippet ist:

(682120, 9) 

0 

(682120, 9) 

(682120, 9) 

[[ 2.37000000e+02 1.60000000e+01 9.90000000e+01 1.04910000e+03 
    9.29000000e-01 9.86000000e-01 8.43000000e-01 4.99290000e+01 
    1.97000000e+00]] 

Der Löschbefehl ändert die Form der Matrix überhaupt nicht.

+0

Gemäß [der Dokumentation] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html) gibt 'numpy.delete' eine _copy_ zurück, wobei die angegebene (n) Spalte (n) gelöscht wird . Beachten Sie außerdem, dass "n" für "n> = 5" ungültig ist, wenn Sie nacheinander Spalten aus dem Array löschen. Sie sollten stattdessen eine "while" -Schleife anwenden und immer die erste löschen. –

Antwort

2

np.delete gibt eine Kopie des Eingabearrays mit entfernten Elementen zurück.

Zurück ein neues Array mit Sub-Arrays entlang einer Achse gelöscht.

Es gibt keine Löschung von Array-Elementen in numpy.

Da np.delete eine Kopie zurück und verändert nicht die Eingabe besteht keine Notwendigkeit, manuell eine Kopie all_input_data zu machen:

import numpy as np 
all_input_data = np.random.rand(100, 9) 

for n in range(9): 
    print(n) 
    testArray = np.delete(all_input_data,[n],axis=1) 
    print(testArray.shape) 
    print(testArray[0:1][:]) 
+0

@a_guest Ich denke, dass du hauptsächlich aus einem Grund falsch liegst: 'all_input_data' wird nie geändert. Der Rest folgt daraus. – kazemakase

+0

@a_guets Sie liegen wieder falsch. Das Array ist in jeder Iteration unterschiedlich. Vielleicht sollten Sie versuchen, den Code vor dem Kommentieren auszuführen. So wie ich die Frage verstanden habe, möchte das OP Spalten ** einzeln nacheinander löschen, nicht nacheinander. – kazemakase

+0

Das ursprüngliche Array wird in jeder Schleifeniteration kopiert, was stark darauf hindeutet, dass das Array nicht geändert werden soll. Aber es ist ziemlich nutzlos, über seine Absichten zu spekulieren. Früher oder später kann das OP diesen Punkt klären. – kazemakase

1

Von verknüpft Frage betrachten diese:

In [2]: a = np.arange(12).reshape(3,4) 

In [3]: np.delete(a, [1,3], axis=1) 
Out[3]: 
array([[ 0, 2], 
     [ 4, 6], 
     [ 8, 10]]) 

In [4]: a 
Out[4]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 

Mit anderen Worten: Wenn Sie Änderungen speichern möchten, sollten Sie sie in einer neuen Variablen speichern. Unter Berücksichtigung der Größe Ihrer Matrix ist dies jedoch nicht praktikabel. Was Sie tun könnten, ist Slice Notation Indexierung zu verwenden. Es wird erklärt here.

+1

Die Verwendung der Slice-Notation (tatsächliche Indizierung) zum Entfernen einzelner Spalten erfordert [erweiterte Indizierung] (https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced-indexing), die auch das Array nur kopiert wie 'löschen'. – kazemakase

+0

Vielen Dank für den Hinweis. – narn

Verwandte Themen