我正在尝试创建包含值(正面或负面)的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)]
但我相信这种错误的方式并没有效果,任何建议或帮助都将受到赞赏。
答案 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上讨论这个问题。