Liste bearbeiten

Oct 01 2020

Ich habe einen Datensatz (Satellitendaten) - Hier ist der Link:

https://drive.google.com/drive/folders/1qBOROSDHSRMykZjWgP7iRMtpQ3gBMceL?usp=sharing

Um einen bestimmten Teil des Datensatzes zu lesen, verwendet man:

LISTA = FileNames[]; (* Here you assume you have your files in one specific Directory and list them*)

data1 = Import[
   LISTA[[1]], {"Datasets", "/PRODUCT/methane_mixing_ratio"}];

Überprüfung der Datenstruktur, die man bekommt

Dimensions[data1]

{1, 4173, 215}

Ich möchte einen Teil des Hintergrunds (oder der NaN-Daten) entfernen und 0 (Nullen) setzen.

Newdata1 = Flatten[ReplaceAll[data1, s_ /; s > 5000 -> 0]]

Wenn dies getan wird, wird die Datenstruktur jedoch "zerstört" und wird nur eine große Liste mit einem Element

Dimensions[Newdata1]

{897195}

Gibt es eine Möglichkeit, diese Nummer zu ersetzen und ihre Struktur beizubehalten (1 x 4173 x 214)?

Ich habe versucht, dies ohne die Option "Reduzieren" zu tun, aber dann funktioniert es nicht. Ich habe einige der Fragen hier gesehen, und dies könnte ein Problem mit verschachtelten Listen sein, aber ich bin nicht sicher, wie ich das lösen soll.

Antworten

1 user1066 Oct 01 2020 at 02:03

Ein Fall für Clip?

Clip[RandomReal[10000, {3, 4, 5}],{5000,Infinity},{0,Infinity}]
1 kglr Oct 31 2020 at 02:20

Sie können auch verwenden Threshold, was zu meiner Überraschung schneller ist als Clip.

SeedRandom[1]
data1 = RandomReal[10000, {1, 4173, 215}];

Ersetzen von Zahlen größer als 5000 durch 0:

t1a = First @ RepeatedTiming[
    res1a = Subtract[data1, Threshold[data1, 5000 + $MachineEpsilon]]];
t2a = First @ RepeatedTiming[res2a = Clip[data1, {0, 5000}, {0, 0}]];
t3a = First @ RepeatedTiming[res3a = data1 UnitStep[Subtract[5000, data1]]];
t4a = First @ RepeatedTiming[res4a = Replace[data1, s_ /; s > 5000 -> 0., All]];
t5a = First @ RepeatedTiming[res5a = ReplaceAll[data1, s_ /; s > 5000 -> 0.]];

res1a == res2a == res3a == res4a == res5a
True
Dimensions @ res1a
 {1, 4173, 215}

Ersetzen von Zahlen unter 5000 durch 0:

t1b = First @ RepeatedTiming[res1b = Threshold[data1, 5000 + $MachineEpsilon]];
t2b = First @ RepeatedTiming[res2b = Clip[data1, {5000, ∞}, {0, ∞}]];
t3b = First @ RepeatedTiming[res3b = data1 UnitStep[Subtract[data1, 5000]]];
t4b = First @ RepeatedTiming[res4b = Replace[data1, s_ /; s < 5000 -> 0., All]];
t5b = First @ RepeatedTiming[res5b = ReplaceAll[data1, s_ /; s < 5000 -> 0.]];

res1b == res2b == res3b == res4b == res5b
True
Dimensions @ res1b
 {1, 4173, 215}

Timing-Vergleiche

{timingsa, timingsb} = {{t1a, t2a, t3a, t4a, t5a}, {t1b, t2b, t3b, t4b, t5b}};

functionsa = {"Subtract[data1,Threshold[data1,5000+$MachineEpsilon]]", "Clip[data1,{0,5000},{0,0}]", "data1 UnitStep[Subtract[5000,data1]]", "Replace[data1,s_/;s>5000\[Rule]0., All]", "ReplaceAll[data1,s_/;s>5000\[Rule]0.]"}; functionsb = {"Threshold[data1,5000+$MachineEpsilon]", 
   "Clip[data1,{5000, Infinity},{0,Infinity}]", 
   "data1 UnitStep[Subtract[data1,5000]]", 
   "Replace[data1,s_/;s<5000\[Rule]0., All]", 
   "ReplaceAll[data1,s_/;s<5000\[Rule]0.]"};

Grid[Join[{{Item["Replace numbers greater than 5000 with 0", 
     Background -> LightBlue], SpanFromLeft}}, 
  Transpose[{functionsa, timingsa}], 
 {{Item["Replace numbers less than 5000 with 0", 
     Background -> LightBlue], SpanFromLeft}}, 
  Transpose[{functionsb, timingsb}]], 
 Alignment -> {{Left, "."}, Center}, Dividers -> All]