Python numpy arange值正在意外更改符号

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

我正在教我的EF一点关于
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
for
np.arange
有关。如果传入一个整数start、stop和step to
arange
,则输出将是一个整数数组

在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
vs
100.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.        ]