记录一下我踩的坑,都是代码基础不扎实的报应。
想求一个二维列表的最小值,于是直接用了min 函数,但对一个二维列表用min函数,返回的是包含最小值的子列表,而不是最小值本身。
导致我后面用这个最小值跟其他值比较时报错:
File "/home/ubuntu/wzk/gcl/new4_syntheticLR/craft_training.py", line 529, in split_and_choose_bins
if min_fid <= value <= min_fid+5 :
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
意思是我用了一个多元素的数组与标量进行比较,这样会导致数组的每个元素与标量比较,得到的是一个布尔值数组,而不是一个布尔值,因此if语句无法判断。
min_fid = min(first_fid_scores)
second_fid_scores = []
second_bins = []
for i,row in enumerate(first_fid_scores):
for j,value in enumerate(row):
if min_fid <= value <= min_fid+5 :
second_fid_scores.append(value)
second_bins.append(first_bins[i][j])
这是我代码出错的地方,刚开始我以为出错的是value,以为first_fid_score是三维的,导致value是一个列表,但我检查后没发现问题,但发现first_bin多了一维,于是改了first_bin。但运行了十个小时候,代码到了这个地方又出错了,我反复检查,怎么也没有想到,原来是min_fid求错了。
我直觉上以为min函数可以像np.min函数一样,直接返回多维列表的最小值,没想到它居然返回的是子列表。
可以有以下2种改法:
1.双重min:
min_fid = min(min(first_fid_scores))
first_fid_scores是二维的,第一个min返回了包含最小值的子列表,那么对这个子列表再求最小值便可得到first_fid_scores的最小值。
2.把列表展开,对所有元素求min
# 将first_fid_scores展平成一个列表
all_values = [value for sublist in first_fid_scores for value in sublist]
# 计算所有值中的最小值
min_fid = min(all_values)
一个小错误浪费我两天时间......希望别再犯类似
2024.5.23 第三篇笔记