我试图通过两个输入参数用def floored_percentage(val):
return f"{floor(val*100)}%"
创建两个列表,我想将它们传递到通过numpy.arange
初始化为3x3矩阵的数组中。问题在于该通行证仅适用于0.1,并且我看不到我做错了什么。我的代码:
np.zeros
在控制台上创建以下输出:
import numpy as np
from time import sleep
def Stabilizer(px,pz):
ss = 0.05
#initialize an array for data aquisition: 1st row is for countrate, 2nd and 3rd row for x and z values in V
values_x = np.zeros((3,3), dtype=float)
values_z = np.zeros((3,3), dtype=float)
sleep(5)
values_x[2] = pz
values_z[1] = px
x_range = np.arange(px-ss, px+ss,ss)
z_range = np.arange(pz-ss, pz+ss,ss)
print(x_range)
print(z_range)
values_x[1] = x_range
values_z[2] = z_range
for i,x_value in enumerate(x_range):
#change_pos(x_channel, x_value)
sleep(1)
start = 1000
stop = 1+i
countrate = stop - start
values_x[0,i] = countrate
print(x_value)
print(values_x)
Stabilizer(0.1,0.2)
从理论上讲,函数Traceback (most recent call last):
File "C:/Users/x/PycharmProjects/NV_centre/test.py", line 46, in <module>
Stabilizer(0.1,0.2)
File "C:/Users/x/PycharmProjects/NV_centre/test.py", line 35, in Stabilizer
values_z[2] = z_range
ValueError: could not broadcast input array from shape (2) into shape (3)
[0.05 0.1 0.15]
[0.15 0.2 ]
创建一个具有输出[0.05 0.1]的列表。当我在理论上使用np.arange(px-ss, px+ss,ss)
时,输出为[0.05 0.1 0.15],但输出为[0.05 0.1 0.15 0.2]。对于np.arange(px-ss, px+2*ss,ss)
,输出为[0.15 0.2 0.25],这是正确的。我不明白为什么会出现这种差异,因为两个列表都是以相同的方式创建的。
答案 0 :(得分:2)
使用非整数步(使用0.05)时,numpy.arange的结果不一致。相反,使用numpy.linspace会得到更一致的结果。
ref:https://numpy.org/doc/stable/reference/generated/numpy.arange.html
答案 1 :(得分:2)
np.arange()
不适用于浮点数,因为浮点运算具有舍入错误。 Refer this for more details.
在这种情况下,最好使用np.linspace()
。因此,将以下行更改为:
x_range = np.linspace(px-ss, px+ss,3)
z_range = np.linspace(pz-ss, pz+ss,3)
这可以正常工作。
答案 2 :(得分:0)
这是我能想到的最佳解决方案:
x_range = [round(i, 2) for i in np.arange(px-ss, px+2*ss,ss) if i<px+2*ss]