Liste bearbeiten
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
Ein Fall für Clip?
Clip[RandomReal[10000, {3, 4, 5}],{5000,Infinity},{0,Infinity}]
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]