用Numpy改善循环

时间:2019-06-05 14:07:10

标签: python-3.x numpy while-loop

我给出了以下三个变量:

start      = 30    #starting value
end        = 60    #ending value
slice_size = 6     #value difference per tuble

startend是数组的行号。我的目标是创建一个元组数组/列表,其中每个元组都包含slice_size定义的项目。一个小例子:如果startend具有上述值,则前四个元组将是:

[[30,35],[36,41],[42,47],[48,53],...]。

但是现在有了线索:下一个元组的第一个值不是以+ slice_size之前的第一个值开头,而是以第一个值+ slice_size/2开头。所以我想要这样的东西:

[[30,35],[33,38],[36,41],[39,44],...]。

此元组列表一直持续到到达end或恰好到达它之前-直到<=end为止。列表的最后一个值不允许传递end的值。当然,slice_size的值必须始终为偶数才能正常工作。

我的nooby尝试是通过while循环完成的:

condition = 0
i = 0
list = []
half_slice = int(slice_size /2)
while condition <= end:
    list.append([start+int(slice_size/2)*i,start+((slice_size-1)+i*half_slice)])
    condition = start+((slice_size-1)+i*int(slice_size/2))
    i += 1

问题是,它可以工作。但是我知道这完全是垃圾,我想提高自己的技能。您有几个代码行中有建议吗?

2 个答案:

答案 0 :(得分:1)

1)请勿使用list作为变量名。它是保留的关键字。
2)不是NumPy解决方案,但您可以使用列表理解:

start      = 30    #starting value
end        = 60    #ending value
slice_size = 6     #value difference per tuble

result = [[current, current + slice_size - 1] for current in range(start, end - slice_size + 2, slice_size // 2)]
print(result)

输出:

[[30, 35], [33, 38], [36, 41], [39, 44], [42, 47], [45, 50], [48, 53], [51, 56], [54, 59]]

这也适用于奇数slice_size

答案 1 :(得分:1)

您不得使用list,因为它是保留字

import numpy as np

start      = 30    #starting value
end        = 60    #ending value
slice_size = 6     #value difference per tuble

l = [[i,j] for i,j in zip(np.arange(start, end, slice_size/2),
                          np.arange(start + slice_size - 1,
                                    end + slice_size - 1,
                                    slice_size/2)
                          )
     ]
print(l)

输出:

[[30.0, 35.0],
 [33.0, 38.0],
 [36.0, 41.0],
 [39.0, 44.0],
 [42.0, 47.0],
 [45.0, 50.0],
 [48.0, 53.0],
 [51.0, 56.0],
 [54.0, 59.0],
 [57.0, 62.0]]