【问题标题】:The most efficient way to loop n-d np.array循环 n-d np.array 的最有效方法
【发布时间】:2016-03-26 11:25:01
【问题描述】:

1。简介

假设有一个形状为 (365,100,100) 的 3-d 数组:Prec

  • 代表一个地区全年的日降水情况。
  • 显然,第一个维度代表时间序列。
  • 最后2个维度代表空间分布(例如,1km x 1 km有10000个网格)

2。尝试

测试整个区域的每个网格的降水量是否高于一定的干湿分离值 Pd。我想总结全年的干燥日。

3。我的代码

freq = np.zeros(100,100).reshape(100,100)
Pd = xxx
for i in range(0,prec.shape[0],1):
    for j in range(0,prec.shape[1],1):
        for k in range(0,prec.shape[2],1):   
            if prec[i,j,k] < Pd:
               freq[j,k] +=1

我认为太多的循环肯定会浪费时间。有没有一些最干净的方法来完成类似的工作?
任何建议将不胜感激!

【问题讨论】:

  • Divakar 下面的回答非常好。个人认为,对于这种东西,numpy 级别太低了,pandas 才是正道。
  • 我只熟悉 pandas 的数据框。有一天我会在pandas 中尝试n-d 数组!谢谢!

标签: python arrays performance numpy vectorization


【解决方案1】:

您正在沿prec 的第一个轴进行比较和求和。可以使用NumPy broadcasting 以矢量化方式进行比较,然后沿第一个轴与.sum(0) 求和,就像这样 -

freq = (prec < Pd).sum(0)

【讨论】:

  • 无循环 - 非常优雅。
  • 请问这种代码的原理是什么?我遇到过一些类似的代码,例如array[array &gt; 0.5]。效率比循环大得多。为什么他们这么快?他们不需要循环遍历所有值吗?
  • @HanZhengzu This 可能会有所启发。 NumPy 旨在以矢量化的快速方式对大量元素执行相同的操作。我认为它的理念是SIMD
猜你喜欢
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多