Manipuler une liste
J'ai un jeu de données (données satellite) - Voici le lien:
https://drive.google.com/drive/folders/1qBOROSDHSRMykZjWgP7iRMtpQ3gBMceL?usp=sharing
Pour lire une partie spécifique de l'ensemble de données, on utilise:
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"}];
Vérification de la structure de données obtenue
Dimensions[data1]
{1, 4173, 215}
Je veux me débarrasser d'une partie de l'arrière-plan (ou des données NaN) et mettre 0 (zéros)
Newdata1 = Flatten[ReplaceAll[data1, s_ /; s > 5000 -> 0]]
Cependant, lorsque cela est fait, la structure de données est "détruite" et ne devient qu'une grande liste d'éléments
Dimensions[Newdata1]
{897195}
Existe-t-il un moyen de remplacer ces numéros et de conserver sa structure (1 x 4173 x 214)?
J'ai essayé de le faire sans utiliser l'option Flatten, mais je ne fonctionne pas.J'ai vu certaines des questions ici et cela pourrait être un cas de problème de liste imbriquée, mais je ne sais pas comment résoudre cela.
Réponses
Un cas pour Clip?
Clip[RandomReal[10000, {3, 4, 5}],{5000,Infinity},{0,Infinity}]
Vous pouvez également utiliser Threshold, qui, à ma grande surprise, est plus rapide que Clip.
SeedRandom[1]
data1 = RandomReal[10000, {1, 4173, 215}];
Remplacement des nombres supérieurs à 5000 par 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}
Remplacement des nombres inférieurs à 5000 par 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}
Comparaisons de temps
{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]