我想在python中创建一个数组,其中值2n和2n + 1之间有固定的间距,值2n + 1和2n + 2之间有另一个不同的间距。
我想创建一个类似下面的数组,只指定我想要使用的初始点,最终点和两个不同的间距:
x = [0 0.25 0.75 1 1.5 1.75]
在这种情况下,这些值对于间距将是0和2以及(0.25,0.5)。
是否可以使用预定义功能执行此操作?
我没有在numpy包中找到这个功能。
答案 0 :(得分:4)
试试这个:
np.cumsum(np.tile([0.25, 0.5], 9))
如果您想要添加零,请将其包装在np.insert(x, 0, 0)
。
答案 1 :(得分:2)
我认为一个问题是计算元素的数量,这可能是模棱两可的,这取决于你想要在终点发生什么。这是一个如何处理它的例子,虽然我稍后需要再看一下它是否有意义。我从@Mauris的答案中取得了cumsum
和tile
组合。
import numpy as np
def spaced_array(start, end, spacings):
step = sum(spacings)
# how many steps in total can we take? (upper bound)
repeats = int(np.ceil((end - start) / step))
n = repeats * len(spacings)
arr = np.full(n, start)
arr[1:] += np.cumsum(np.tile(spacings, repeats))[:n-1]
return arr
spacings = [0.25, 0.5]
print(spaced_array(0, 2, spacings))
print(spaced_array(0, 5, spacings))
答案 2 :(得分:2)
确定一般情况下输出数组的长度可能很棘手,正如@ YXD解决方案中所讨论的那样。假设您想要在添加了第二个间距的点结束,您可以初始化一个零数组,将起始值作为第一个元素,然后交替放置第一个和第二个间距,最后进行累积求和以获得所需的输出。这是在这些方面实现某些目标的实现 -
# Random inputs
start_pt = 0.25
final_pt = 2.85
spacing1 = 0.15
spacing2 = 0.50
# Estimate length of output array
N = 1+2*int(np.ceil((final_pt - start_pt)/(spacing1+spacing2)))
# Setup values array that holds the starting point as the first element
# and then spacing1 and spacing2 alternately
vals = np.zeros(N)
vals[0] = start_pt
vals[1::2] = spacing1
vals[2::2] = spacing2
# Finally, do cumsum to get the desired output
out = vals.cumsum()
使用列出的输入进行输出 -
In [134]: out
Out[134]: array([ 0.25, 0.4 , 0.9 , 1.05, 1.55, 1.7 , 2.2 , 2.35, 2.85])