Re: [問題] mathematica的排序與篩選

看板Mathematica作者 (養花種魚數月亮賞星星)時間13年前 (2011/12/14 13:40), 編輯推噓2(200)
留言2則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《harry901 (forcing to A cup)》之銘言: : 問題:mathematica有篩選與排序的語法嗎? : 假設 我有一串列資料ANS[m,n] m列 n行 每一列的行表示不同屬性 : 現在我需要比較這些屬性依序篩選 然後排列大小 我們假設 : 人 國 英 數 : ANS[5,4] = [王小明 99 60 31] : [李大同 75 51 66] : [陳小偉 71 20 43] : [高小茜 81 80 79] : [馬英文 78 56 26] : 若我要篩選出所有數學大於30分且國文60以上的同學,mathematica有辦法直接篩選嗎? : 查了資料似乎沒有篩選的語法...我只能先令一個FinalANS存放篩選結果 : 步驟一,先計算出FinalANS的長度 : templength=0; : For[i=1,i=Length[ANS],i++, : If[ANS[[i,2]]>60&&ANS[[i,4]]>30,templength++,{}] : ] : 上面可以將templength計算出FinalANS所需的長度 : 步驟二,將篩選後結果放入FinalANS中,如 : FinalANS=Array[fnlans,{templength,4}]; : tempwrite=0; : For[i=1,i=Length[ANS],i++, : If[ANS[[i,2]]>60&&ANS[[i,4]]>30,tempwrite++; : FinalANS[[i]]=ANS[[tempwrite]],{}] : ] : 這樣就可以完成篩選的答案(步驟一二應該可以合併在同一個loop裡面,一時想不出) : 不過 像這樣的例子 : mathematica沒辦法直接用簡單的過濾方式求得嗎? : 最後是排序FinalANS 若我要依照英文成績由高排至低 : 那麼 我又得寫類似上面的迴圈一個一個去判斷...可以用Sort等等方式慢慢擠出來 : 試問 mathematica有相關排序的語法嗎? data = {{"王小明", 99, 60, 31}, {"李大同", 75, 51, 66}, {"陳小偉", 71, 20, 43}, {"高小茜", 81, 80, 79}, {"馬英文", 78, 56, 26}}; mydata=Select[data, #[[4]] >= 30 && #[[2]] >= 60 &] 要排序的話,可以使用 ?Sort 或是 ?SortBy 了解更多的設定 按總分 SortBy[mydata,Total] 按姓名 SortBy[mydata,First] 按國文 SortBy[mydata,#[[2]]&] 按英文 SoryBy[mydata,#[[3]]&] Select, Cases這些都是可以作為篩選的函數,不過Pattern Matching也是ok data /. {a_, b_, c_, d_} :> {a, b, c, d} /; b >= 60 && d >= 30 找出1,2,.....,100任意三個數加總等於100的所有組合 AbsoluteTiming@ReplaceList[Range[100], {___,a_,___,b_,___,c_,___}:>{a,b,c}/;a+b+c==50] AbsoluteTiming@Select[Subsets[Range[100],{3}],Total@#==50&] -- 養花種魚數月亮賞星星 http://chungyuandye.twbbs.org ※ 編輯: chungyuandye 來自: 218.173.131.148 (12/14 13:53)

12/14 13:55, , 1F
真是謝謝~ 又學到一招了...
12/14 13:55, 1F

12/14 13:59, , 2F
篩選用Select就可以了 我居然笨到還寫迴圈
12/14 13:59, 2F
文章代碼(AID): #1Ew3ReuU (Mathematica)
討論串 (同標題文章)
文章代碼(AID): #1Ew3ReuU (Mathematica)