两个数字之间的列表 - 定义步数,而不是步长

List between two numbers - definine number of steps, not step size

我想在两个数字之间创建一个列表,例如:

import numpy as np

np.arange(0,100,10)

输出:

array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])

但是我不想定义步长,而是定义步数。如果我定义了 3 个步骤,那么我想得到这个列表:

array([ 0, 50, 100])

或4个步骤:

array([0, 33, 66, 100])

以此类推


我是否必须设置 4(对于所有值)或 2(仅对于插值)以获得最后的输出或者我是否正在获取数组或列表都没有关系。 rounds/ceils 的方式也无关紧要。创建这样的列表只是合乎逻辑的。

您可以继续使用np.arange功能。您只需要根据最大值和最小值计算步长,以及步数:

import numpy as np
import math

nb_steps = 3
min_val = 0
max_val = 100

step_size = math.floor((max_val-min_val)/nb_steps)
arr = np.arange(min_val,max_val,step_size)

# update last value to match max_val
# this step is needed if (max_val-min_val)/nb_steps is a decimal number
arr[-1] = max_val

您也可以使用 numpy.linspace,正如评论中指出的那样:

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)

https://numpy.org/doc/stable/reference/generated/numpy.linspace.html

def listWithNumberOfStep(startNumber, endNumber, nbSteps):
   listNumber = []
   delta = endNumber - startNumber
   for i in range(nbSteps + 1):
      listNumber.append(startNumber + (delta/nbSteps * i))
   return listNumber

我觉得像这样就好了

even_arange = lambda n: np.arange(0, 101, 100/(n-1)).astype("int64")
even_arange(n)

from functools import partial
even_arnage = partial(start=0, stop=100, dtype="int64")
even_arange(num=n)

如评论中所述,numpy.linspace returns 在指定间隔内均匀分布数字。

import numpy as np

n_steps = 3 
np.linspace(start=0, stop=100, num=n_steps)
array([  0.,  50., 100.])

n_steps = 4
np.linspace(start=0, stop=100, num=n_steps)
array([  0.        ,  33.33333333,  66.66666667, 100.        ])

编辑 如果您要查找整数,则可以转换为 int 数据类型:

import numpy as np

n_steps = 3 
np.linspace(start=0, stop=100, num=n_steps, dtype=int)
array([  0,  50, 100])

n_steps = 4
np.linspace(start=0, stop=100, num=n_steps, dtype=int)
array([  0,  33,  66, 100])

对于纯 python(没有任何库)。

def generate_range(start, end, steps):
   return [start + i*(end-start)/(steps-1) for i in range(steps)]

示例用法

generate_range(0, 100, 4)  
# returns [0.0, 33.333333333333336, 66.66666666666667, 100.0]

generate_range(-200, 400, 5)
# returns [-200.0, -50.0, 100.0, 250.0, 400.0]