python:将数字绘制为自定义范围

时间:2014-06-01 05:19:39

标签: python average

我不确定如何实际说出来,但基本上我想要做的是让3组数字相当于0到10的范围,所以我可以稍后再调用它。

例如,如果我有数字2,4和9,我想要它,以便2表示0,4表示为5,9表示10.这样一来,如果我写一个类似于“call for”的命令一个代表2.5“的数字,然后它给了我更多的例子:

0 = 2,2.5 = 3,5 = 4,7.5 = 6.5,10 = 9

我想要它,以便在我设置这些数字之后,我可以通过说明我想要的比例的哪一部分来调用2-9的自定义范围(就像我想要代表1.25的值)。有没有办法在Python中做这样的事情......?

PS:如果这样的问题已经存在,我很抱歉,我只是不知道这种事情是什么。

编辑:只是让你更多地了解我想要做的事情,我试图将这个东西设置为Maya(3d程序)中的脚本,我会有一组曲线。现在我编写了一个脚本,通过取3个点的平均值并将该平均值替换为中间数来平滑锯齿状曲线。但我想做的不是仅仅取平均值,而是能够输入0-10的值,因此它控制曲线平滑的程度。所以,如果我有一条曲线,我在Y上说2 6和4,而不是使中间数字3.667(三个值的平均值),我希望它是4或3.25,或者除了平均。基本上我只想要一个0-10系统来控制这个数字减少了多少。我希望这有道理.......

4 个答案:

答案 0 :(得分:1)

任何三点,你都可以define a quadratic curve that fits them

例如,modifying code from this VB helper page,你得到

def fit(p1, p2, p3):
    """Return the quadratic function that fits the three points p1, p2, p3,
    each defined as a tuple of (x,y) coordinates"""
    a = ((p2[1]-p1[1])*(p1[0]-p3[0]) + (p3[1]-p1[1])*(p2[0]-p1[0])) / \
        ((p1[0]-p3[0])*(p2[0]**2-p1[0]**2) + (p2[0]-p1[0])*(p3[0]**2-p1[0]**2))
    b = ((p2[1]-p1[1]) - a*(p2[0]**2 - p1[0]**2)) / (p2[0]-p1[0])
    c = p1[1] - a*p1[0]**2 - b*p1[0]
    return lambda x: a*x**2 + b*x + c

将为您提供一个可以使用的函数(在Python 3中),如下所示:

>>> f = fit((0,2), (5,4), (10,9))
>>> f(2)
2.44
>>> f(100)
612.0
>>> f(4)
3.36
>>> f(5)
4.0
>>> f(9)
7.760000000000001

在Python 2中,您需要使用浮动显式调用它:

>>> f = fit((0.0,2.0), (5.0,4.0), (10.0,9.0))

答案 1 :(得分:0)

您可以使用字典来存储数据对,例如

x = {0:2, 2.5:3, 5:4, 7.5:6.5, 10:9}

然后只需使用字典的键即可获得所需的值。

>>> x[0]
2

答案 2 :(得分:0)

您可以使用此功能生成"范围"你需要的点数:

def range_(lst, size):
    i = 0.0
    while i < size:
        i += size/float(len(size))
        yield i

然后你可以用这样的原始列表压缩这个函数的结果:

def range_(lst, size):
    i = 0.0
    while i <= size:
        yield i
        i += size/float(len(lst)-1)

vals = [2,3,4,6]

res = dict(zip(range_(vals,10),vals))

print res

这给出了:

{0.0: 2, 3.3333333333333335: 3, 10.0: 6, 6.666666666666667: 4}

答案 3 :(得分:0)

试试这个:

from random import random
from math import ceil


def get_number(num):
  return ceil(random() * 10 * num)/10

def return_set():
  my_set = []
  add_up_to_me = 10.0
  for i in range(0,2):
   num = get_number(add_up_to_me)
   add_up_to_me -= num
   my_set.append(num)
  my_set.append((add_up_to_me * 10)/10)
  return my_set

correlate = {}

for i,j in zip(return_set(),return_set()):
  correlate[i] = j

print correlate