看板 Python 關於我們 聯絡資訊
接著幫回 也說明一下我的想法 不管怎樣 直接貼code給大家看我還是覺得不是很好 不是有沒有誠意 是這樣看code真的很容易誤看 沒有色碼 縮排又痛苦… 我先貼的原po的code ( 參考https://www.ptt.cc/bbs/C_and_CPP/M.1460282360.A.ADC.htmlhttps://ideone.com/3wBqbL 雖然不行run完 但至少好讀 怕以後連結不見的話,ptt貼code可以放最後,有需要再去看 然後縮8格...有點逼我吉娃娃…看開點 個人建議4格就好 ※ 引述《TuCH (謬客)》之銘言: : 先稍微整理一下 : ※ 引述《MAGICXX (逢甲阿法)》之銘言: : : 大家好 : : 1. : : 我現在有一組程式碼有問題 : : upperb=NDVI_LST[col[0]]>0.0 : : lowerb=NDVI_LST[col[0]]<0.1 : : edge_1=NDVI_LST[(upperb & lowerb)] : col_0 = col[0] : col_1 = col[1] 的確, col 0 跟 1 如果常用到 寫成變數是好事 一來維護簡潔 二來執行有可能加速 三來字數可能變少 : upperb=NDVI_LST[col_0]>0.0 : lowerb=NDVI_LST[col_0]<0.1 : edge_1=NDVI_LST[(upperb & lowerb)] : : lst_values=[] : : for i in edge_1[col[0]]: : : LST=NDVI_LST.loc[NDVI_LST[col[0]]==i,col[1]] : : NDVI=i # 這行不知道在幹嘛 的確 整個code沒用到 建議刪除 通用會這樣寫只有可能為了可讀性或延用到別人function的變數名調整而已 : : for j in LST.values: : : lst_values.append(j) 這段理解後似乎也沒有必要 你開了一個空list 然後把pd的LST轉np的array 再一個一個值塞回去… 你可以簡單的tolist() (如果你需要python的list的話) 或是list_values = LST.values (怕不小心改到值的話用copy) : : df.loc[0.0,'w1月']=max(lst_values) 最後只找max的話 pandas也有max可以用(還會幫忙去掉nan值) 上面提到塞list的動作也可以省略 : # 這段看不懂在幹嘛 : max_lst_values = edge_1[col_1].max() : min_lst_values = edge_1[col_1].min() : : lst_values=[] : : for i in edge_1[col[0]]: : : LST=NDVI_LST.loc[NDVI_LST[col[0]]==i,col[1]] : : NDVI=i : : for j in LST.values: : : lst_values.append(j) : : df.loc[0.0,'d1月']=min(lst_values) : : 因為我現在會需要有12個月的重複計算以及 : : upperb以及lowerb的重複計算(0.0 ,0.1, 0.2, 0.3.....1.0) 需要回圈跑的東西通通for loop就可以了 12個月、upperb、lowerb什麼的 沒有什麼是不能for loop的 下面的整段code我研究了一下 給你一些建議: 1. for i in range(10) a. i已經是整數 int(i)顯得多餘 b. 整段code的i for loop 只對NDVI_bound取index得到值 何不直接for loop NDVI_bound[:-1] 反正i+1也只是+0.1 2. 你的 lst_values=[] 應該是放錯位置了 從append方式很奇怪之外,這個變數也沒有被用到(for i j loop) for k loop有用到 但內圈 i j loop一直洗掉 lst_values 想必有問題 個人通靈建議lst_values=[]至少提升至for k loop下 : : 原本我是用下面的code跑 可是每次都會剩下最後一個值然後把前面的值蓋掉 : : NDVI_bound=np.around(np.linspace(0,1,11).tolist(),decimals=2) : : for k in range(1,13): : : for j in range(23): : : for i in range(10): : : upperb=NDVI_LST[col[int(j)]]>NDVI_bound[int(i)] : : lowerb=NDVI_LST[col[int(j)]]<NDVI_bound[int(i)+1] : : edge_1=NDVI_LST[(upperb & lowerb)] : : lst_values=[] : : for l in edge_1[col[int(j)]]: : : LST=NDVI_LST.loc[NDVI_LST[col[int(j)]]==l,col[int(j)+1]] : : NDVI=i : : for m in LST.values: : : lst_values.append(m) : : if lst_values==[]: : : df.loc[NDVI_bound[int(i)+1],'w'+str(k)+'月']=0 : : df.loc[NDVI_bound[int(i)+1],'d'+str(k)+'月']=0 : : else: : : df.loc[NDVI_bound[int(i)+1],'w'+str(k)+'月']=max(lst_values) : : df.loc[NDVI_bound[int(i)+1],'d'+str(k)+'月']=min(lst_values) : : 我想問一下大家 這樣要怎麼縮減這個程式碼才會是對的? 你是說 indent 吧? 縮排 如上通靈 放至for k loop 裡 : : 不然我光是用一個一個貼 就要2000多行程式碼 可是明明是重複做一樣的動作... 用幾行算錢的話 這樣也不錯啊... 不過感覺這不是主要問題 你forloop沒事 存值邏輯要調整而已 如果上面通靈有誤 那你必需開更多的欄位來儲存結果 : 這邊完全沒有對K做操作 請檢查一下code跟邏輯 原po的k是用來幫df塞月份的值的 應該是lst_values=[]寫在for loop i造成的誤會 : : 2.查表 : : 我找的值是從上面那張表出來的 : : D1 W1 : : 0.1 23.7 22.4 : : 0.2 25.8 26.88 : : 0.3 29.8 30.64 : : . : : . : : . : : 1.0 35.26 38.31 : : 我現在給他一個值 他要怎麼找到在這張表的哪個範圍? : : 比如說 我現在給他27.33這個數值 他要怎麼找到是在0.2~0.3之間 : : 然後跟我說上限是29.8 下限是25.8 這樣? : : 有兩個問題 再麻煩各位了QQ : binary search 給個方向 找27.33 >= D1的最後一個true對應到的就是下限25.8 找27.33 < D1的第一個true對應到的就是上限29.8 配合index可以找到0.2~0.3之類的東西 建議寫成function比較不影響程式整體的邏輯思考 p.s. 真的不外包給我嗎 省時省力 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.116.120.190 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1619066109.A.046.html
MAGICXX: 肛溫蛤~ 04/22 16:09