Python 循环n-dnp.array的最有效方法 1.介绍

Python 循环n-dnp.array的最有效方法 1.介绍,python,arrays,performance,numpy,vectorization,Python,Arrays,Performance,Numpy,Vectorization,假设有一个形状为(365100100)的三维阵列:Prec 代表一个地区全年的日降水量情况 显然,第一个维度代表时间序列 最后两个维度表示空间分布(例如,有10000个网格,大小为1km x 1km) 2.企图 测试整个区域的每个网格的降水量是否高于一定值Pd,这将干湿分开。我想计算一下全年的干旱天数 3.我的代码 freq=np.零(100100).重塑(100100) Pd=xxx 对于范围内的i(0,预制形状[0],1): 对于范围内的j(0,预制形状[1],1): 对于范围内的k(0

假设有一个形状为(365100100)的三维阵列:Prec

  • 代表一个地区全年的日降水量情况
  • 显然,第一个维度代表时间序列
  • 最后两个维度表示空间分布(例如,有10000个网格,大小为1km x 1km)
2.企图 测试整个区域的每个网格的降水量是否高于一定值Pd,这将干湿分开。我想计算一下全年的干旱天数

3.我的代码
freq=np.零(100100).重塑(100100)
Pd=xxx
对于范围内的i(0,预制形状[0],1):
对于范围内的j(0,预制形状[1],1):
对于范围内的k(0,预制形状[2],1):
如果prec[i,j,k]
我认为太多的循环肯定会浪费时间。有没有最干净的方法来完成类似的工作?

如有任何建议,将不胜感激

您正在沿
prec
的第一个轴进行比较和求和。可以使用矢量化的方式执行该比较,然后沿着第一个轴与求和,如下所示-

freq = (prec < Pd).sum(0)
freq=(prec
您正在沿
prec
的第一个轴进行比较和求和。可以使用矢量化的方式执行该比较,然后沿着第一个轴与求和,如下所示-

freq = (prec < Pd).sum(0)
freq=(prec
无循环-非常优雅。请问这类代码的原理是什么?我遇到过一些类似的代码,比如
array[array>0.5]
。效率比循环大得多。为什么他们这么快?难道他们不需要循环来遍历所有的值吗?@HanZhengzu可能会有所启发。NumPy是为以矢量化的快速方式对大量元素执行相同操作而构建的。我认为它的哲学是。没有循环-非常优雅。请问这种代码的原理是什么?我遇到过一些类似的代码,比如
array[array>0.5]
。效率比循环大得多。为什么他们这么快?难道他们不需要循环来遍历所有的值吗?@HanZhengzu可能会有所启发。NumPy是为以矢量化的快速方式对大量元素执行相同操作而构建的。我认为它的哲学是正确的。迪瓦卡下面的回答非常好。就我个人而言,我认为对于这种类型的东西,
numpy
的级别太低了,
pandas
是一个不错的选择。我只熟悉使用
pandas
的dataframe。总有一天我会在
pandas
中尝试n-d数组!谢谢下面Divakar的回答非常好。就我个人而言,我认为对于这种类型的东西,
numpy
的级别太低了,
pandas
是一个不错的选择。我只熟悉使用
pandas
的dataframe。总有一天我会在
pandas
中尝试n-d数组!谢谢