Ich möchte ausgewählte Spalten in einem numpy.array löschen. Das ist was ich mache:
n [397]: a = array([[ NaN, 2., 3., NaN],
.....: [ 1., 2., 3., 9]])
In [398]: print a
[[ NaN 2. 3. NaN]
[ 1. 2. 3. 9.]]
In [399]: z = any(isnan(a), axis=0)
In [400]: print z
[ True False False True]
In [401]: delete(a, z, axis = 1)
Out[401]:
array([[ 3., NaN],
[ 3., 9.]])
In diesem Beispiel ist mein Ziel, alle Spalten zu löschen, die NaNs enthalten. Ich erwarte, dass der letzte Befehl Folgendes ergibt:
array([[2., 3.],
[2., 3.]])
Wie kann ich das machen?
numpy
, nichtscipy
. docs.scipy.org/doc/numpy/reference/generated/numpy.delete.htmlBeispiel aus der Numpy-Dokumentation :
>>> a = numpy.array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) >>> numpy.delete(a, numpy.s_[1:3], axis=0) # remove rows 1 and 2 array([[ 0, 1, 2, 3], [12, 13, 14, 15]]) >>> numpy.delete(a, numpy.s_[1:3], axis=1) # remove columns 1 and 2 array([[ 0, 3], [ 4, 7], [ 8, 11], [12, 15]])
quelle
A nicer way to build up index tuples for arrays.
: docs.scipy.org/doc/numpy/reference/generated/numpy.s_.htmlEine andere Möglichkeit ist die Verwendung maskierter Arrays:
import numpy as np a = np.array([[ np.nan, 2., 3., np.nan], [ 1., 2., 3., 9]]) print(a) # [[ NaN 2. 3. NaN] # [ 1. 2. 3. 9.]]
Die Methode np.ma.masked_invalid gibt ein maskiertes Array mit ausgeblendeten nans und infs zurück:
print(np.ma.masked_invalid(a)) [[-- 2.0 3.0 --] [1.0 2.0 3.0 9.0]]
Die Methode np.ma.compress_cols gibt ein 2D-Array mit einer beliebigen Spalte zurück, die einen unterdrückten maskierten Wert enthält:
a=np.ma.compress_cols(np.ma.masked_invalid(a)) print(a) # [[ 2. 3.] # [ 2. 3.]]
Siehe Manipulieren eines Maskenfelds
quelle
Dadurch wird ein weiteres Array ohne diese Spalten erstellt:
b = a.compress(logical_not(z), axis=1)
quelle
Aus der Numpy-Dokumentation
np.delete (arr, obj, axis = None) Gibt ein neues Array mit Unterarrays entlang einer gelöschten Achse zurück.
>>> arr array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) >>> np.delete(arr, 1, 0) array([[ 1, 2, 3, 4], [ 9, 10, 11, 12]]) >>> np.delete(arr, np.s_[::2], 1) array([[ 2, 4], [ 6, 8], [10, 12]]) >>> np.delete(arr, [1,3,5], None) array([ 1, 3, 5, 7, 8, 9, 10, 11, 12])
quelle
In Ihrer Situation können Sie die gewünschten Daten extrahieren mit:
"-z" ist die logische Negation des booleschen Arrays "z". Dies ist das gleiche wie:
quelle
>>> A = array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) >>> A = A.transpose() >>> A = A[1:].transpose()
quelle
Entfernen von Matrixspalten, die NaN enthalten. Dies ist eine lange Antwort, die aber hoffentlich leicht zu befolgen ist.
def column_to_vector(matrix, i): return [row[i] for row in matrix] import numpy def remove_NaN_columns(matrix): import scipy import math from numpy import column_stack, vstack columns = A.shape[1] #print("columns", columns) result = [] skip_column = True for column in range(0, columns): vector = column_to_vector(A, column) skip_column = False for value in vector: # print(column, vector, value, math.isnan(value) ) if math.isnan(value): skip_column = True if skip_column == False: result.append(vector) return column_stack(result) ### test it A = vstack(([ float('NaN'), 2., 3., float('NaN')], [ 1., 2., 3., 9])) print("A shape", A.shape, "\n", A) B = remove_NaN_columns(A) print("B shape", B.shape, "\n", B) A shape (2, 4) [[ nan 2. 3. nan] [ 1. 2. 3. 9.]] B shape (2, 2) [[ 2. 3.] [ 2. 3.]]
quelle