我正在尝试重新编写一些看起来像是由FORTRAN程序员编写的代码,以使其更具Pythonic /可读性。以下是感兴趣的代码段。代码的整体行为是将Z的前三个元素存储到Zstart中,只要值小于1,并且只要它们小于1,也将Z的最后三个值存储到Zend中。 / p>
import numpy as np
nbpoints = 3
Z = np.linspace(0,1.0,10)
Zstart = np.ones(nbpoints)
Zend = np.ones(nbpoints)
Zpts = np.size(Z)
for j in range(nbpoints):
if Z[j] < Zstart[j]:
Zstart[j] = Z[j]
if Z[Zpts - 1 - j] < Zend[nbpoints - 1 - j]:
Zend[nbpoints - 1 - j] = Z[Zpts - 1 - j]
Zstart和Zend两端的计数器移动访问让我有点沮丧。我目前的解决方案如下。
import numpy as np
nbpoints = 3
Z = np.linspace(0,1.0,10)
Zstart = np.ones(nbpoints)
Zend = np.ones(nbpoints)
Zpts = np.size(Z)
for j in range(nbpoints):
if Z[j] < Zstart[j]:
Zstart[j] = Z[j]
if Z[-(j+1)] < Zend[-(j+1)]:
Zend[-(j+1)] = Z[-(j+1)]
此代码的示例输出为:
Z = [ 0.0 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556
0.66666667 0.77777778 0.88888889 1.0 ]
Zstart = [ 0.0 0.11111111 0.22222222]
Zend = [ 0.77777778 0.88888889 1.0 ]
我的解决方案感觉我仍然只是重写写得不好的代码,例如重新安排泰坦尼克号甲板上的椅子。是否有更多的Pythonic方法来执行此操作?
答案 0 :(得分:1)
此代码在没有移动计数器的情况下提供相同的结果
nbpoints = 3
Z=np.linspace(0,1.,10.)
Zstart = np.ones(nbpoints)
Zend = np.ones(nbpoints)
Zstart[Z[:nbpoints] < 1] = Z[:nbpoints][Z[:nbpoints] < 1]
Zend[Z[-nbpoints:] < 1] = Z[-nbpoints:][Z[-nbpoints:] < 1]
答案 1 :(得分:1)
您不需要使用Zstart
实例化Zend
和np.ones
。直接构建它们:
nbpoints = 3
Z = np.linspace(0,1.0,10)
Zstart = Z[:nbpoints][Z[:nbpoints] < 1]
Zend = Z[-nbpoints:][Z[-nbpoints:] < 1]
print(Zstart)
print(Zend)
# [ 0. 0.11111111 0.22222222]
# [ 0.77777778 0.88888889]
请注意Zend
此处只有2个元素,因为Z
中的最后一个元素不小于1.