在Python中绘制不包含零值的直方图?

5

当我尝试制作不包含零值的直方图时,出现错误:

Traceback (most recent call last):

我有一个Beam_irradiance_DNI值的列表,其中包括几个零。我可以制作直方图,但我不想要零值。

import matplotlib.pyplot as plt
import numpy as np

import csv

# Reading data from csv file
with open('Upington_DNI.csv') as csvfile:
readCSV = csv.reader(csvfile, delimiter=',')
Hour_of_year = []
Beam_irradiance = []
for row in readCSV:
    hour = row[0]
    DNI = row[1]
    Hour_of_year.append(hour)
    Beam_irradiance.append(DNI)
Hours_since00hrsJan1 = [float(Hour_of_year[c]) for c in       range(1,len(Hour_of_year))]
Beam_irradiance_DNI=[float(Beam_irradiance[c]) for c in range(1,len(Beam_irradiance))]

plt.figure(3)
Beam_irradiance_DNI[ Beam_irradiance_DNI==0 ] = np.nan
plt.hist(Beam_irradiance_DNI, color="grey")
plt.title("Histogram for Beam irradiance - DNI")
plt.xlabel("Beam irradiance - DNI [W/m2]"); plt.ylabel("Probability of  occurrence")
plt.show()

我不知道这里出了什么问题。

这些是浮点数吗?如果是,仅检查精确等于零是不够的。您需要检查abs(val)< epsilon。此外,您可以仅抓取非零值并创建新数组,而不是用NaN替换。然后您就不会修改原始数据。另外,看起来您的变量为空... - Suever
我在你的列表中看不到任何零。 - Stop harming Monica
@Suever 谢谢您的评论。我已经包含了整个代码。现在请您建议一种方法? - Arvind Sastry
2个回答

4

您只能对numpy.array进行逻辑索引(data[data != 0]),而普通的Python列表不支持。如果您想从Python列表中删除值,您需要使用列表推导式来完成。

newvalues = [x for x in Beam_irradiance_DNI if x != 0]

另一种选择是将您的Python列表实际转换为NumPy数组。
nparray = np.array(Bean_irradiance_DNI)

那么你就能够进行你想要执行的逻辑索引了。

nparray[nparray == 0] = np.nan

另一种选择是不改变数组本身,只将非零值传递给hist
plt.hist(Beam_irradiance_DNI[Beam_irradiance_DNI != 0], color="grey")

如果您仍然遇到零的问题,很可能是因为这些数字被存储为浮点数,它们的值并不是完全为零。针对这种情况,您应该使用以下条件来检测"零"。

is_zero = np.absolute(Beam_irradiance_DNI) < np.finfo(float).eps
Beam_irradiance_DNI[is_zero] = np.nan

谢谢你的回答!是的,我把列表改成了NumPy数组,现在它可以工作了!非常感谢! - Arvind Sastry
@ArvindSastry 如果这个解决方案对您有用,请考虑将其标记为解决方案,以帮助可能搜索此相同问题的人们。 - Suever
@Suever。我遇到了一个问题:“ValueError: cannot convert float NaN to integer”。请问我该如何处理? - Ravi

2
import numpy as np
Beam_irradiance_DNI = np.array(Beam_irradiance_DNI)
plt.hist(Beam_irradiance_DNI[Beam_irradiance_DNI>0], color="grey")

这应该是有效的,因为你只保留了大于零的元素(Beam_irradiance_DNI>0 是一个布尔掩码,用作索引)。如果你想进一步使用它,请将其保存为变量;但如果你只想排除零值进行直方图处理,则无需重新定义变量。


你好!我尝试了这个方法,但它不起作用。我得到了以下错误:TypeError: unorderable types: list() > int()。是的,我不想再使用它了,我只想从直方图中排除零。 - Arvind Sastry
@ArvindSastry - 在“plt.hist”行之前,也许只需要执行“Beam_irradiance_DNI = np.array(Beam_irradiance_DNI)”即可。 - MSeifert
@ArvindSastry - 请不要忘记为您的问题接受其中一个答案。 :-) - MSeifert
@lafemmecosmique,你还需要对条件array[:,0][array[:,0] > 0]进行索引。 - MSeifert
@MSeifert非常感谢您回答我的随机问题。您刚刚为我节省了很多时间。干杯! :) - la femme cosmique

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接