使用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
相关产品推荐
相关产品推荐

