【问题标题】:How can I set a range to work with numpy's arange如何设置范围以使用 numpy arange
【发布时间】:2018-08-19 01:19:26
【问题描述】:

我正在尝试在 Flask 应用程序中创建天气小部件。我一直坚持以度(角度)为单位处理风向。

如果我们用下图作为表示:

风向

在处理风向时,我们被限制在 360 度范围内。我想根据我获得的 360 度范围内的风向分配一个图标,以帮助您了解以下信息:

| Cardinal Direction | Degree Direction |
|:------------------:|------------------|
|          N         |   348.75 - 11.25 |
|         NNE        |    11.25 - 33.75 |
|         NE         |    33.75 - 56.25 |
|         ENE        |    56.25 - 78.75 |
|          E         |   78.75 - 101.25 |
|         ESE        |  101.25 - 123.75 |
|         SE         |  123.75 - 146.25 |
|         SSE        |  146.25 - 168.75 |
|          S         |  168.75 - 191.25 |
|         SSW        |  191.25 - 213.75 |
|         SW         |  213.75 - 236.25 |
|         WSW        |  236.25 - 258.75 |
|          W         |  258.75 - 281.25 |
|         WNW        |  281.25 - 303.75 |
|         NW         |  303.75 - 326.25 |
|         NNW        |  326.25 - 348.75 |

我会将键/值存储在 dict 中并创建一个 if elif else 循环,该循环将执行以下操作:

from numpy import arange
degrees = the_json_response['wind']['deg']
wind_directions = {
    'N': arange(348.75, 11.25, 0.25),
    ...
}
degrees_range = range(0, 360)
if degrees in wind_direction['N']:
    dirction = north_icon
elif degrees in wind_direction['NNE']:
    direction = north_north_east_icon
    

以上只是伪代码.. 总而言之,我该如何应用它,以便我们只在 360 度范围内工作,因为显然它在处理北风方向时会抛出错误,因为它在一个范围内348.75 - 11.25,我们需要告诉它我们正在使用 360 度。

我无法为我的身材生活的原因是我从未学过复杂的数学(对我来说就是这样)。如果有人对我如何以更好的方式应用它有任何建议,我非常愿意接受这些建议。

【问题讨论】:

  • 取模运算符?
  • 你为什么使用arange
  • @MadPhysicist 我正在使用 arange 所以我可以以 0.25 的步长使用一系列浮点数..
  • @MadPhysicist 你愿意详细说明你的评论吗?
  • @JamieLindsey 为了确保我理解正确:给定范围 [0,360] 的度数,您想根据表格为其分配一个基本方向,对吧?

标签: python python-3.x numpy


【解决方案1】:

要将任何数字包装到特定范围,请使用模 (%):How does % work in Python?。幸运的是,python 实现使结果的符号始终等于右手操作数。以下是模数如何将所有内容包装到所需范围的一些示例:

>>> 45 % 360
45
>>> -38 % 360
322
>>> 1000 % 360
280

鉴于此,很容易将任何以度为单位的值映射到字母缩写。每个缩写代表一个 22.5 度宽的窗口。窗口从零偏移 11.25 度,所以我们可以通过做得到一个窗口索引

from math import floor

index = floor(((deg + 11.25) % 360) / 22.5)

此索引始终是 0 到 15 之间的数字。您可以直接使用它来索引指南针的点列表,无需任何字典或昂贵的搜索:

list_of_points = ['N', 'NNE', 'NE', ..., 'NW', 'NNW']

def deg_to_point(deg):
    return list_of_points[floor(((deg + 11.25) % 360) / 22.5)]

这很有效,因为您所有的垃圾箱都大小相同。例如,如果您想要罗盘上的更多点,您可以将 11.25 和 22.5 减半。如果您有不相等的 bin,最好的办法是使用模数对输入进行归一化,然后在 bin 边缘进行二分搜索。

【讨论】:

  • 你先生是个天才!我正在思考deg_to_point() 函数来学习如何做更多这样的事情。非常感谢!我想我实际上理解这一点,这通常不是数学的情况。答案标记为已接受。
  • @Jamie。你尽你所能。很高兴它帮助你理解
  • 当我收到您的回答通知时,我正在阅读question a..
【解决方案2】:

这是一个想法:您可以检查度数范围的上限是否低于下限,然后分两步创建arange。例如:348.75, 11.25 是唯一一种上限11.25 小于下限348.75 的情况,这意味着由于周期性,360 介于两者之间。对于所有其他度数范围和方向,上限大于下限。因此,您可以创建N,将360 包含在一个范围内,将其余值包含在另一个范围内。

x = np.arange( 348.75, 360, 0.25) 
y = np.arange(0.25, 11.25, 0.25) 
'N' = np.concatenate((x ,y), axis=0)

只是一个想法,也许你可以改进它。

【讨论】:

  • 老实说,我不得不说我不理解逻辑。这给出的值指数等于 0、1 和 2,并且小数点在错误的位置 - 例如array([3.4875e+02, 3.4900e+02, 3.4925e+02, 3.4950e+02 ...也许我应该编辑我的问题,让大家知道我不是最好的数学家
  • 对于 100 以上的值,指数为 2,两位数为 1,一位数为 0。它只是表示。 3e+02 和 300 意思一样
  • 你的方程式还不在我的能力范围内,因为我不知道你的意思是什么哈哈。 MadPhysicist 提供了一个我理解的完美工作示例。谢谢你的努力,虽然我很感激。
猜你喜欢
  • 2014-03-25
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
相关资源
最近更新 更多