python - Manglende elementer, mens man forstår med np.all og får fjernede indekser

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et datasæt med størrelsen på (400,40). Nogle af kolonnerne er helt nul. De er ikke nødvendige for beregningerne (jeg skal ignorere dem), men de er nødvendige for at omskrive filen.


Så jeg bruger numpy til at importere det som et array, få initialiseringen færdig. Men et problem opstår, når jeg forsøger at omvendte matrixen (igen, nødvendig for beregningerne). Så vidt jeg ved, hvis en matrix har en fuld nul kolonne, er det umuligt at omvendte det (det (M)=0).


Så jeg bruger dette til at få kolonner uden kolonner:


nonZero = dataSet[:, np.all(dataSet != 0, axis=0)]


(Jeg prøvede også at opsummere kolonnen med np.sum inden for np.all), men det hopper nogle kolonner uden grund.


For eksempel har min første række:


[ 0, -1, -2, -3, 181, 5451, 0, 0, 8, 8, 1, 9, 9, 1, 0.11, 0, 0 ] etc.


Når jeg kører ovenstående kode får jeg:


[ -1.  -2.  -3.  181.  8.  8.  1.  9.  9.  1.  ]


5451 og 0.11 forsvinder, selvom hele søjlen ikke er 0 eller de er 0.


Jeg har også brug for at få de fjernede kolonneindekser, da jeg skal revurdere dem efter beregningerne ...


Jeg er ikke den bedste Python-koder, men jeg kan ikke synes at løse problemet, eller forstå, hvorfor det sker. Jeg har for nylig lært at bruge numpy, og jeg er ret nybegynder i det. Det har foruroliget mig i 2 dage nu. Enhver anbefaling/hjælp er værdsat.

Bedste reference


np.all er som and det vil tjekke hver værdi, hvis dens nul. Hvad du vil have, er at bruge np.any til or som adfærd, dvs. hvis du vil forsømme 0'erne til stede i eksemplet ikke-nul søjle


dataSet = np.array([** 0, -1, -2, -3, 181, 5451, 0, 0, 8, 8, 1, 9, 9, 1, 0.11, 0, 0 ],
                [ 0, -1, -2, -3, 181, 5451, 0, 0, 8, 8, 1, 9, 9, 1, 0, 0, 0 ],
                [ 0, -1, -2, -3, 181, 0,    0, 0, 8, 8, 1, 9, 9, 1, 0.11, 0, 0 **])
nonZero = dataSet[:, np.any(dataSet, axis=0)]
nonZero


array([** -1.00000000e+00,  -2.00000000e+00,  -3.00000000e+00,
          1.81000000e+02,   5.45100000e+03,   8.00000000e+00,
          8.00000000e+00,   1.00000000e+00,   9.00000000e+00,
          9.00000000e+00,   1.00000000e+00,   1.10000000e-01],
       [ -1.00000000e+00,  -2.00000000e+00,  -3.00000000e+00,
          1.81000000e+02,   5.45100000e+03,   8.00000000e+00,
          8.00000000e+00,   1.00000000e+00,   9.00000000e+00,
          9.00000000e+00,   1.00000000e+00,   0.00000000e+00],
       [ -1.00000000e+00,  -2.00000000e+00,  -3.00000000e+00,
          1.81000000e+02,   0.00000000e+00,   8.00000000e+00,
          8.00000000e+00,   1.00000000e+00,   9.00000000e+00,
          9.00000000e+00,   1.00000000e+00,   1.10000000e-01**])


Hvis du vil udtrække kolonner tegn, kan du bruge np.where dvs.


np.where(~dataSet.any(axis=0))


Produktion:


(array([ 0,  6,  7, 15, 16]),)

Andre referencer 1


Der er en fejl i din logik. Du ønsker ikke at kassere kolonnerne, hvor alle værdier er ikke-nøjagtige . I betragtning af forklaringen vil du kassere kolonner, der alle er nul:


For eksempel:


arr = np.array([**1, 1, 0, 1, 0, 0, 1, 0, 0, 1],
                [1, 0, 0, 1, 1, 1, 1, 0, 0, 1],
                [0, 1, 0, 1, 0, 1, 0, 0, 0, 0],
                [1, 0, 0, 1, 0, 0, 0, 0, 1, 0],
                [0, 0, 0, 1, 0, 0, 0, 0, 1, 0**])
arr[:, ~np.all(arr == 0, axis=0)]
# array([**1, 1, 1, 0, 0, 1, 0, 1],
#        [1, 0, 1, 1, 1, 1, 0, 1],
#        [0, 1, 1, 0, 1, 0, 0, 0],
#        [1, 0, 1, 0, 0, 0, 1, 0],
#        [0, 0, 1, 0, 0, 0, 1, 0**])


Men du kan også bruge np.any i stedet for np.all: [19]


arr[:, np.any(arr != 0, axis=0)]

Andre referencer 2


Det er altid bedst at arbejde med mindre eksempler.


For eksempel:


arr = np.array([
    [0, 0, 1],
    [0, 1, 1]
])

nonzero = arr != 0
print(nonzero)
# prints
# [**False False  True]
#  [False  True  True**]

all\_nonzero = np.all(nonzero, axis=0)
print(all\_nonzero)
# prints
# [False False  True]


Nu ser du problemet. Din logik opretter en kolonnemaske, der kun vælger kolonner, for hvilke alle elementer i kolonnen er ikke-nul. Hvad du egentlig vil have, er kolonnerne, hvor ikke alle elementerne er nul eller en anden måde: hvor ethvert element i kolonnen er ikke-nul.


any\_nonzero = np.any(nonzero, axis=0)
print(any\_nonzero)
# prints
# [False  True  True]