Manipuler une liste

Oct 01 2020

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

1 user1066 Oct 01 2020 at 02:03

Un cas pour Clip?

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

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]