Python numpy arange值正在意外更改符号
我正在教我的EF一点关于Python numpy arange值正在意外更改符号,python,python-3.x,numpy,Python,Python 3.x,Numpy,我正在教我的EF一点关于numpy的知识,我已经把我的一些旧的本科课本掸掉,作为例子。因此,我编写了一个不带numpy的函数来计算悬臂梁在任何点上由于单点荷载而产生的挠度。非常直截了当,只是挠度方程会根据点力的哪一侧而变化,所以我将把梁分成两个范围,计算范围内每个间隔处的挠度值,并将结果附加到列表中。这是密码 def deflection(l, P, a, E, I): """ Calculate the deflection of a cantilever beam due t
numpy
的知识,我已经把我的一些旧的本科课本掸掉,作为例子。因此,我编写了一个不带numpy
的函数来计算悬臂梁在任何点上由于单点荷载而产生的挠度。非常直截了当,只是挠度方程会根据点力的哪一侧而变化,所以我将把梁分成两个范围,计算范围内每个间隔处的挠度值,并将结果附加到列表中。这是密码
def deflection(l, P, a, E, I):
"""
Calculate the deflection of a cantilever beam due to a simple point load.
Calculates the deflection at equal one inch intervals along the beam and
returns the deflection as a list along with the the length range.
Parameters
----------
l : float
beam length (in)
P : float
Point Force (lbs)
a : float
distance from fixed end to force (in)
E : float
modulus of elasticity (psi)
I : float
moment of inertia (in**4)
Returns
-------
list
x : distance along beam (in)
list of floats
y : deflection of beam (in)
Raises
------
ValueError
If a < 0 or a > l (denoting force location is off the beam)
"""
if (a < 0) or (a > l):
raise ValueError('force location is off beam')
x1 = range(0, a)
x2 = range(a, l + 1)
deflects = []
for x in x1:
y = (3 * a - x) * (P * x**2) / (6 * E * I)
deflects.append(y)
for x in x2:
y = (3 * x - a) * (P * a**2) / (6 * E * I)
deflects.append(y)
return list(x1) + list(x2), deflects
如果您运行绘图,您将看到在x1
中的点x=93
处,曲线中有一个错位,该值似乎改变了符号。有人能解释发生了什么事吗?b)我做错了什么?尝试使用numpy.arange(…,dtype=numpy.double)或使用astype(np.double)强制转换结果
这两者之间可能有一些微妙的差别——类似于带浮点数的for循环,我认为astype是一个更好的habbit。我打赌这与一些人建议的溢出无关,而与默认的
dtype
fornp.arange
有关。如果传入一个整数start、stop和step toarange
,则输出将是一个整数数组
在Python2.x中,/
操作符使用整数除法
例如:
import numpy as np
print np.arange(10) / 3
结果:
[0 0 0 1 1 1 2 2 2 3]
但是,
np.arange(10, dtype=float) / 3
或
或
都会导致
[ 0. 0.33333333 0.66666667 1. 1.33333333 1.66666667
2. 2.33333333 2.66666667 3. ]
如果希望
/
运算符始终将结果向上转换为浮点值,则可以使用from\uuuuuu future\uuuuuu.import division
另一种选择是了解阵列的数据类型。Numpy允许您对数据在内存中的存储方式进行非常低级的控制。这在实践中非常非常有用,但一开始可能有点令人惊讶。然而,上行规则非常简单,值得注意。基本上,每当在一个操作中使用两种类型时,如果它们相同,则会保留该类型。否则,将使用两者中更一般的一种 小心溢出。您所说的浮动参数实际上是整数,Python整数与NumPy整数具有非常不同的溢出行为。@user2357112:您说得对!我将输入标注更改为
l,P,a,E,I=120.00,1200.00,100.00,30000000.00,926.00
(这也意味着我必须在非numpy范围定义中将a
和l
转换为整数),错位已修复。@user2357112,保护numpy函数不受此溢出影响的正确/首选方法是什么?显然,如果用户可以输入100
vs100.0
,他们会这样做。当输入进入函数时,我是否重铸输入?或者我是否将dtype
更改为int64
或其他什么?我可能会在函数中使用浮点常量而不是int,为arange指定适当的数据类型,并将输入转换为带有l,P,a,E,I=map(float,[l,P,a,E,I])
@dbliss Python使用“无限”int类型,而numpy使用非常特定的位类型。因此,Python int溢出要困难得多,并且在将Python int转换为numpy int时相对容易出错(而不是相反)。实际上,如果将浮点标量和int ndarray混合在一起,输出总是一个浮点。Numpy类型并不比内置类型更“粘”。Numpy故意遵循python在这方面的相同约定,它只是有更多的数字类型(例如,uint8
,float16
,等等)。@JoeKington你是对的,我可以发誓我在2008年左右就被它咬过。注意Python3标签。在Python3上尝试OP的代码会产生OP描述的结果;使用Python2除法规则进行尝试会产生非常不同的输出。@user2357112,您是对的。给出的结果来自Python 3.4。
np.arange(10, dtype=float) / 3
np.arange(10.0) / 3
np.arange(10) / 3.0
[ 0. 0.33333333 0.66666667 1. 1.33333333 1.66666667
2. 2.33333333 2.66666667 3. ]