接着帮回 也说明一下我的想法
不管怎样 直接贴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. 真的不外包给我吗 省时省力