生成两个范围之间的数字 - python3

时间:2018-02-01 14:45:39

标签: python-3.x numpy range

我正在尝试创建包含值(正面或负面)的numpy数组,并使用step(start,stop,step)在x和y之间使用float类型。

我做了它可以使用的代码,但由于数字范围的长度超过应有的长度,因此无效。

In loop --- the right length --- what I get
0             4                    4
1             16                   16
2             64                   64
3             256 **               289 **
4             1024                 1024
5             4096                 4096
6             16384 **             16641 **
7             65536                65536

你可以看到我应该得到什么和得到什么之间的区别

请查看我所做的代码,它会让我对这个问题有一个很好的了解:

from itertools import product
import math
import random
import numpy as np
from timeit import default_timer as timer
np.set_printoptions(threshold=np.nan)


start = -5.12
stop = 5.12

dimension = 2

level =1
loop= 10

the_right_size = (2**level)**dimension

# here we creat a step to move from start to stop beasd on the step.
step = (1/((2**level)-1))*(stop-start)

if __name__ == "__main__":
    for i in range (loop):

        step = (1/((2**level)-1))*(stop-start)
        the_right_size = (2**level)**dimension

        number_range = [j for j in product(np.arange(start, stop+step, step), repeat=dimension)]
        number_range = np.array(number_range)

        print ("number range lenght", (len(number_range)))

        print("the_right_size", the_right_size)
        level = level +1

通过改变这一行来解决这个问题:

number_range = [j for j in product(np.arange(start, stop+step, step), repeat=dimension)]

number_range = [j for j in product(np.arange(start, stop+step/2, step), repeat=dimension)]

但我相信这种错误的方式并没有效果,任何建议或帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

您遇到了浮点运算的常见问题。在二进制系统中,并非每个数字都可以表示。 See for instance here for more information. 这种情况的第一个提示已经存在于你的数字中:对于n = 3,你得到17²而不是16²而n =6129²而不是128²。包含

的行中出现问题
np.arange(start, stop+step, step)

原因是你事先计算了一步。通常,您使用np.arange计算正确数量的数据点,但由于浮点不准确,您有时会在stop值之后增加一个点。 要解决此问题,您可以将此行重写为

number_range = np.array(list(product(np.arange(start, stop + 0.0001, step), repeat=dimension)))

0.0001可以是小于最小step值的任何小数字。但这不是最佳的 - 如果step变得非常小,该怎么办?您通过在计算中将step减半来提出另一种解决方案,从而为您提供正确数量的数据点 但是为什么不让numpy处理所有这些实现细节并在这种情况下使用np.linspace

number_range = np.array(list(product(np.linspace(start, stop, 2 ** level), repeat=dimension)))

step在这里是开始和停止之间的点数,numpy负责计算。问题解决了。
您可能已经注意到我也替换了您的

[j for j in product(...)]

list(product(...))

因为它们是等价的。您可以在代码中优化一些内容,也许您想在Code Review上讨论这个问题。