python - 在numpy数组上进行条件循环?
问题描述
我是 Python 的初学者,我通常用 C 编程。
所以,我有一个 numpy 二维数组。我对 (i,j),(i+1,j),(i,j+1) 和 (i+1,j+1) 值求平均值,如果它高于所选值,我将其求和.
这是我的python代码:
Z=np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]])
sum=0.
value=7.
for i in range(np.shape(Z)[0]-1):
for j in range(np.shape(Z)[1]-1):
a = (Z[i,j] + Z[i+1,j] + Z[i,j+1] + Z[i+1,j+1]) / 4
if (a>=value):
sum+=a
print (sum)
我知道这听起来不太像pythonic。如何以 pythonic 方式编写它以加速大型 2D numpy 数组上的代码?
感谢您的回答
解决方案
我会这样做:
quads = Z[:-1,:-1] + Z[1:,:-1] + Z[:-1,1:] + Z[1:,1:]
sum = quads[quads >= value * 4].sum() / 4
第一行计算 2x2 元素和的整个 (x-1,y-1) 数组:
array([[16, 20, 24, 28],
[36, 40, 44, 48]])
第二行将这 8 个元素中的每一个与 进行比较value * 4
,而不是除以quads / 4
不必要的创建另一个相同大小的数组。这让我们可以在最后做一个标量乘法和一个标量除法,而不是数组除法。但是如果你不关心优化,你也可以这样写:
quads /= 4
sum = quads[quads >= value].sum()
推荐阅读
- machine-learning - 使用 yolov5 进行强化学习
- javascript - 如何在javascript中用[[some_text]](some_text)替换每次出现的[some_text](some_text)
- python - 使用 Selenium 自动化 trivago.com 的日期选择器
- python - 在以下代码中声明 dict 和数组的空间复杂度是多少?
- barcode - Java 的条码生成库
- python - 两个日期函数之间的差异不起作用Python
- python - python在类属性中的f-string范围
- javascript - 无法使用 new Date() 更新 Firestore 模拟器文档中的字段
- linux - 在 PTP4l 中发送延迟请求失败错误?
- computer-science - 如何修复我的代码以找到二阶 LTI?