python - numpy 跨矩阵执行条件运算
问题描述
我有这段代码适用于我试图在整个矩阵上执行的单个值。我从矩阵开始sst
并使用它来获取矩阵pb_opt
:
if sst < -10:
pb_opt = 0
elif sst < -1:
pb_opt = 1.13
elif sst > 28.5:
pb_opt = 4
else:
pb_opt = 1.2956 + (2.749e-1 * sst) + 6.17e-2 * (sst ** 2) - 2.05e-2 * (sst ** 3)
+2.462e-3 * (sst ** 4) - 1.348e-4 * (sst ** 5) + 3.4132e-6 * (sst ** 6)
-3.27e-8 * (sst ** 7)
我通过运行开始工作的前几个 if/else 语句:
pb_opt = np.full(sst.shape, np.nan)
pb_opt[sst < -10] = 0
pb_opt[(-10 <= sst) & (sst < -1)] = 1.13
pb_opt[sst > 28.5] = 4
但是,我正在努力完成最后一个声明。我已经尝试了几件事,我认为我得到的最接近的是:
pb_opt[(-1 >= sst) & (sst <= 28)] = (
1.2956
+ (0.2749 * sst[(-1 >= sst) & (sst <= 28)])
+ 0.0617 * (sst[(-1 >= sst) & (sst <= 28)] ** 2)
- 0.0205 * (sst[(-1 >= sst) & (sst <= 28)] ** 3)
+ 2.462e-3 * (sst[(-1 >= sst) & (sst <= 28)] ** 4)
- 1.348e-4 * (sst[(-1 >= sst) & (sst <= 28)] ** 5)
+ 3.4132e-6 * (sst[(-1 >= sst) & (sst <= 28)] ** 6)
- 3.27e-8 * (sst[(-1 >= sst) & (sst <= 28)] ** 7)
)
除了有点难看之外,这给了我错误IndexError: 2-dimensional boolean indexing is not supported.
。有谁知道我怎么能做到这一点?
解决方案
sst
就这样做,如果大小非常大,它会有点慢。如果不是,那么这是一个优雅的解决方案
pb_opt = 1.2956 \
+ 2.749e-1 * (sst ** 1) \
+ 6.17e-2 * (sst ** 2) \
- 2.05e-2 * (sst ** 3) \
+ 2.462e-3 * (sst ** 4) \
- 1.348e-4 * (sst ** 5) \
+ 3.4132e-6 * (sst ** 6) \
- 3.27e-8 * (sst ** 7)
pb_opt[sst < -1 ] = 1.13
pb_opt[sst < -10 ] = 0
pb_opt[sst > 28.5] = 4
推荐阅读
- swift - Swift for TensorFlow - dyld:找不到符号:_$sSly7ElementQz5IndexQzcigTq
- cordova - 如何在没有此错误的情况下安装分叉和自定义的离子原生科尔多瓦插件?
- c# - 通过 X 坐标迭代列表列表?
- json - 从 Angular 7 服务传递时,ipcRenderer 参数 JSON 对象如何丢失数据?
- c# - DocumentEditor InsertBefore 似乎无法在文档中找到节点
- python - 如何在由类对象组成的列表中查找特定值的最大元素索引?
- java - 了解 Jtransform 和 ColumbiaFFT 的 FFT 输出
- css - 如何将我的网站徽标移到容器外部的左侧
- ssl - Kubernetes 入口:SSL(HTTP -> HTTPS)重定向不起作用(Nginx Docker)
- go - 如何使用 Go 模块通过提交哈希或分支来拉取依赖项?