Memanipulasi daftar

Oct 01 2020

Saya memiliki dataset (data satelit) - Ini tautannya:

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

Untuk membaca bagian tertentu dari kumpulan data yang digunakan:

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"}];

Memeriksa struktur data yang didapat

Dimensions[data1]

{1, 4173, 215}

Saya ingin menyingkirkan beberapa latar belakang (atau data NaN) dan meletakkan 0 (nol)

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

Namun ketika ini dilakukan, struktur data "dihancurkan" dan menjadi hanya satu daftar elemen yang besar

Dimensions[Newdata1]

{897195}

Adakah cara untuk mengganti nomor tersebut dan mempertahankan strukturnya (1 x 4173 x 214)?

Saya telah mencoba melakukannya tanpa menggunakan opsi Ratakan tetapi kemudian saya tidak berfungsi.Saya telah melihat beberapa pertanyaan di sini dan ini mungkin kasus masalah daftar bersarang, tetapi saya tidak yakin bagaimana menyelesaikannya.

Jawaban

1 user1066 Oct 01 2020 at 02:03

Kasus untuk Clip?

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

Anda juga dapat menggunakan Threshold, yang, saya terkejut, lebih cepat dari Clip.

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

Mengganti angka yang lebih besar dari 5000 dengan 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}

Mengganti angka kurang dari 5000 dengan 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}

Perbandingan waktu

{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]