Memanipulasi daftar
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
Kasus untuk Clip?
Clip[RandomReal[10000, {3, 4, 5}],{5000,Infinity},{0,Infinity}]
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]