Pythonic方式以相反的顺序访问numpy数组

时间:2017-10-12 15:29:46

标签: python numpy

我正在尝试重新编写一些看起来像是由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方法来执行此操作?

2 个答案:

答案 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实例化Zendnp.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.