首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy arange值出乎意料地改变了迹象。

numpy arange值出乎意料地改变了迹象。
EN

Stack Overflow用户
提问于 2015-05-08 01:16:31
回答 2查看 321关注 0票数 3

我正在教我一些关于numpy的知识,我已经把我的一些旧的本科课文拿出来作为例子。因此,我编写了一个没有numpy的函数来计算悬臂梁在任何一点上的单点荷载引起的挠度。非常直截了当,除了挠度方程变化取决于点力的哪一边,所以我将梁分成两个区间,计算范围内每个区间的挠度值,并将结果附加到列表中。这是密码。

代码语言:javascript
复制
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

现在我想使用numpy做同样的事情,所以我编写了以下函数:

代码语言:javascript
复制
def np_deflection(l, P, a, E, I):
    """To Do.  Write me."""
    if (a < 0) or (a > l):
        raise ValueError('force location is off beam')
    x1 = np.arange(0, a)
    x2 = np.arange(a, l + 1)
    y1 = (3 * a - x1) * (P * x1**2) / (6 * E * I)
    y2 = (3 * x2 - a) * (P * a**2) / (6 * E * I)
    return np.hstack([x1, x2]), np.hstack([y1, y2])

这是一个问题,在计算中的某个时刻,y1的值发生了变化。下面是一个例子。

代码语言:javascript
复制
if __name__ == '__main__':
import matplotlib.pyplot as plt

l, P, a, E, I = 120, 1200, 100, 30000000, 926

x, y = deflection(l, P, a, E, I)
print(max(y))

np_x, np_y = np_deflection(l, P, a, E, I)
print(max(np_y))

plt.subplot(2, 1, 1)
plt.plot(x, y, 'b.-')
plt.xlabel('dist from fixed end (in)')
plt.ylabel('using a range/list')

plt.subplot(2, 1, 2)
plt.plot(np_x, np_y, 'r.-')
plt.xlabel('dist from fixed end (in)')
plt.ylabel('using numpy range')

plt.show()

如果你运行这个图,你会看到,在x = 93点(在x1中),曲线上有一个错位,其中的值似乎是变化的符号。

谁能解释一下a)发生了什么?我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-09 00:45:30

我敢打赌,这与溢出无关,正如一些人所建议的那样,这与np.arange的默认np.arange无关。如果将整数开始、停止和步骤传递给arange,则输出将是整数数组。

在python2.x中,/操作符使用整数除法。

例如:

代码语言:javascript
复制
import numpy as np

print np.arange(10) / 3

在以下方面的成果:

代码语言:javascript
复制
[0 0 0 1 1 1 2 2 2 3]

然而,

代码语言:javascript
复制
np.arange(10, dtype=float) / 3

代码语言:javascript
复制
np.arange(10.0) / 3

代码语言:javascript
复制
np.arange(10) / 3.0

都会导致

代码语言:javascript
复制
[ 0.          0.33333333  0.66666667  1.          1.33333333  1.66666667
  2.          2.33333333  2.66666667  3.        ]

如果您希望/操作符总是将结果向上转换为浮点,那么您可以使用from __future__ import division

另一种选择是知道数组的数据类型。Numpy允许您对数据如何存储在内存中进行非常低级别的控制。这在实践中是非常非常有用的,但一开始似乎有点令人惊讶。然而,向上转换规则非常简单,值得注意。基本上,每当在操作中使用两种类型时,如果它们是相同的,则保留类型。否则,两者中使用得越普遍。

票数 1
EN

Stack Overflow用户

发布于 2015-05-08 12:49:15

尝试使用numpy.arange(.,dtype=numpy.double)或使用astype(np.double)转换结果

这两者之间可能有一些微妙之处--类似于浮点数的for循环,在谨慎/好的方面出错--我会说,错误类型是更好的选项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30114259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档