接著幫回 也說明一下我的想法
不管怎樣 直接貼code給大家看我還是覺得不是很好
不是有沒有誠意 是這樣看code真的很容易誤看
沒有色碼 縮排又痛苦…
我先貼的原po的code
( 參考https://www.ptt.cc/bbs/C_and_CPP/M.1460282360.A.ADC.html )
https://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. 真的不外包給我嗎 省時省力