【问题标题】:How can I add specific elements in an array using multiple parameters?如何使用多个参数在数组中添加特定元素?
【发布时间】:2020-10-14 22:00:38
【问题描述】:

我有一组带有列的天气数据(日、月、年、雨、温度等)。任务是计算每个夏天的降雨量(每个夏天的总降雨量将与其年份进行对比)。

要对所需元素进行求和,以便将每年的夏季元素加在一起,我将不得不使用 for 循环(已有 80 多年,因此手动查找条目的数量可能不可行) (rainfall[summer][0:90]) 重复了所有年份)。我还列出了相关年份的列表(但不仅仅将夏季条目过滤到这些年份中)。我没有成功地尝试制作一个循环,将同年夏天的元素相加。 寻找有关如何尝试此操作的任何建议。谢谢。

数据样本(1942 年 1 月的第一天):

day, month, year, min_temp (C), max_temp (C), rainfall (mm), windspeed (knot)

1,1,1942,6.8,9.7,0.0,17.2 

2,1,1942,7.9,9.9,0.1,15.2

3,1,1942,8.9,11.2,1.5,14.0

4,1,1942,2.7,9.2,3.5,17.0

5,1,1942,-0.8,3.5,0.6,13.0

6,1,1942,0.7,5.1,0.0,9.7

7,1,1942,0.5,7.1,0.0,10.3

这些是使用(例如,日期列)排列的:

day = day.astype(int)

我首先使用以下方法收集夏季条目:

summer = np.where((month == 6) | (month == 7) | (month == 8 ) )

其中第一个元素是 1942 年 1 月 6 日的数据。 在此之后,我将夏季条目分组到他们的年份几乎没有成功,并且只使用简单的 for 循环创建了相关年份的简单列表。

仅供参考,在类似的任务中,我会使用编译字典,然后使用键和值作为绘图的数据点。

另外,作为参考,前 90 个条目(对应于第一个夏天)总和为:

sum(rainfall[summer][0:90])

在第一个夏季组中输出正确的降雨总和。

Frank Yellin(在下面的线程中)建议使用 np.histogram 来避免计算和保存夏季降雨量的总和,但我也没有运气(“权重必须相同shape as a"(a 是夏天,我认为它是直方图从中收集数据的数组))。虽然没用,但看看我的思路可能会有用。

np.histogram(summer, bins = years, range = (1942, 2020) , weights = rainfall[summer])

我还应该说,我对使用数组进行数据操作还是很陌生,因此感谢您提供任何帮助。至于一个最小可重现的例子,我已经包含了我拥有的代码中最重要的部分,但我仍然不确定正确的方法应该是什么(如前所述创建字典,使用建议的直方图等),所以我在这方面也很短。谢谢。

【问题讨论】:

  • 您能否包含您的代码的 sn-p 以及您正在使用的数据的小版本?这使得给出答案变得更加容易。
  • 为了清晰起见,更新了一些数据和更多代码。
  • 您的数据在 numpy 之外?请提供minimal reproducible example,以及当前和预期的输出。

标签: python arrays sum


【解决方案1】:

由于我不了解您的数据结构,所以我没有完全准确的代码来执行您想要的操作,但我认为您可以使用np.histogram 实现您想要的。

  • a 参数是年份数组,过滤后仅显示 夏季月份。

  • weights 参数是雨量数组,再次过滤。

  • bins 参数将是所有年份的排序列表。

【讨论】:

  • 所以,我可以通过简单地将直方图设置为包括并因此对 bin 期间的雨量求和,就可以避免必须对每个夏天的降雨量进行求和和存储?
  • 它应该根据文档工作。我过去做过类似的事情。你能在小样本上试一试吗?
  • 我仍然对如何将夏季与每年相关联以便每个夏季条目的降雨感到困惑?你对我如何写直方图有什么建议吗?
  • 假设您的年份是 1940-1950 年(含)。那么垃圾箱应该是 np.arange(1940, 1952)。您将得到一个 11 元素数组作为输出。第一个元素是 1940,第二个元素是 1941,……至少我认为它应该是这样工作的。
【解决方案2】:

经过几天的努力,我找到了一个使用相对简单的方法的解决方案。我认为我试图一步一步找出答案的所有部分,使问题过于复杂。我没有通过数组来制作字典,而是使用 for 循环来制作夏季数组的年份和总降雨量的列表。我意识到了一个捷径,即每年夏天都发生在整个夏天数组的 92 个条目中(并发现切片可能比单独的 i 或整数更复杂)。

rains = []

for i in range(0, 79, 1):
    y = sum(rainfall[summer][i*92:i*92 + 92])
    rains.append(y)

必要的年份;

years = []
for i in range(1942, 2021, 1):
    years.append(i)

然后使用 plt.plot(years, rains) 得到了这个漂亮的图表: rainfall

感谢其他贡献者的帮助。我无法形容看到一个相当平凡的图表时的喜悦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    相关资源
    最近更新 更多