You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用numpy.where转换风向角度为方位标签结果异常,求排查

风向角度转16方位标签的numpy代码问题排查

问题描述

我编写了一段Python代码,尝试将以角度表示的风向(如307、45、198、355)转换为"N"、"NE"等16方位标签,使用numpy.where进行条件赋值,但得到的结果不符合预期。

原代码

import numpy as np

dir = np.array([307,45,198,355])

Sixteen_UD = np.empty(len(dir),dtype='str')
Sixteen_UD[np.where(np.logical_or(dir >= 348.75, dir < 11.25))] = "N"
Sixteen_UD[np.where(np.logical_and(dir >= 11.25, dir < 33.75))] = 'NNE'
Sixteen_UD[np.where(np.logical_and(dir >= 33.75, dir < 56.25))] = 'NE'
Sixteen_UD[np.where(np.logical_and(dir >= 56.25, dir < 78.75))] = 'ENE'
Sixteen_UD[np.where(np.logical_and(dir >= 78.75, dir < 101.25))] = 'E'
Sixteen_UD[np.where(np.logical_and(dir >= 101.25, dir < 123.75))] = 'ESE'
Sixteen_UD[np.where(np.logical_and(dir >= 123.75, dir < 146.25))] = 'SE'
Sixteen_UD[np.where(np.logical_and(dir >= 146.25, dir < 168.75))] = 'SSE'
Sixteen_UD[np.where(np.logical_and(dir >= 168.75, dir < 191.25))] = 'S'
Sixteen_UD[np.where(np.logical_and(dir >= 191.25, dir < 213.75))] = 'SSW'
Sixteen_UD[np.where(np.logical_and(dir >= 213.75, dir < 236.25))] = 'SW'
Sixteen_UD[np.where(np.logical_and(dir >= 236.25, dir < 258.75))] = 'WSW'
Sixteen_UD[np.where(np.logical_and(dir >= 258.75, dir < 281.25))] = 'W'
Sixteen_UD[np.where(np.logical_and(dir >= 281.25, dir < 303.75))] = 'WNW'
Sixteen_UD[np.where(np.logical_and(dir >= 303.75, dir < 326.25))] = "NW"
Sixteen_UD[np.where(np.logical_and(dir >= 326.25, dir < 348.75))] = 'NNW'

当前输出

array(['N', 'N', 'S', 'N'], dtype='<U1')

期望输出

['NW','NE','SSW','N']

问题原因及解决方法

1. 字符串类型长度限制

创建Sixteen_UD时使用dtype='str',在numpy中这默认是长度为1的字符串类型(对应输出里的<U1)。当你赋值像'NNE'、'NW'这类多字符标签时,numpy会自动截断为第一个字符,这就是输出全是单字符的核心原因。

解决方法:将数组的dtype改为足够容纳最长方位标签的类型,比如dtype='U3'(所有16方位标签最长为3个字符),或者直接使用object类型。

2. 不必要的np.where调用

numpy数组支持直接用布尔索引赋值,不需要每次都调用np.where,可以简化代码。

3. 内置函数名冲突

变量名dir是Python内置函数(用于查看对象属性),使用它会覆盖内置函数,建议改为dir_arr这类名称。

修正后的代码

import numpy as np

dir_arr = np.array([307, 45, 198, 355])
# 设置能容纳3个字符的字符串类型
Sixteen_UD = np.empty(len(dir_arr), dtype='U3')

# 布尔索引直接赋值,简化代码
Sixteen_UD[(dir_arr >= 348.75) | (dir_arr < 11.25)] = "N"
Sixteen_UD[(dir_arr >= 11.25) & (dir_arr < 33.75)] = 'NNE'
Sixteen_UD[(dir_arr >= 33.75) & (dir_arr < 56.25)] = 'NE'
Sixteen_UD[(dir_arr >= 56.25) & (dir_arr < 78.75)] = 'ENE'
Sixteen_UD[(dir_arr >= 78.75) & (dir_arr < 101.25)] = 'E'
Sixteen_UD[(dir_arr >= 101.25) & (dir_arr < 123.75)] = 'ESE'
Sixteen_UD[(dir_arr >= 123.75) & (dir_arr < 146.25)] = 'SE'
Sixteen_UD[(dir_arr >= 146.25) & (dir_arr < 168.75)] = 'SSE'
Sixteen_UD[(dir_arr >= 168.75) & (dir_arr < 191.25)] = 'S'
Sixteen_UD[(dir_arr >= 191.25) & (dir_arr < 213.75)] = 'SSW'
Sixteen_UD[(dir_arr >= 213.75) & (dir_arr < 236.25)] = 'SW'
Sixteen_UD[(dir_arr >= 236.25) & (dir_arr < 258.75)] = 'WSW'
Sixteen_UD[(dir_arr >= 258.75) & (dir_arr < 281.25)] = 'W'
Sixteen_UD[(dir_arr >= 281.25) & (dir_arr < 303.75)] = 'WNW'
Sixteen_UD[(dir_arr >= 303.75) & (dir_arr < 326.25)] = "NW"
Sixteen_UD[(dir_arr >= 326.25) & (dir_arr < 348.75)] = 'NNW'

print(Sixteen_UD)

修正后输出

array(['NW', 'NE', 'SSW', 'N'], dtype='<U3')

内容的提问来源于stack exchange,提问作者user8229029

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:57:33