NumPy数组的列索引有没有可读性更好的实现方式?
针对NumPy数组具名列索引的最优实现方案
方案一:使用NumPy原生结构化数组(零依赖、高兼容)
这是最贴合你需求的原生实现,列名信息会和数组实体绑定,无需在各函数重复定义下标常量,也不需要额外传参,运算性能和普通NumPy数组完全一致。
实现步骤:
- 按照你现有7列的实际顺序,提前定义带字段名的自定义dtype
- 一次性将原有普通数组转换为结构化数组,转换开销可忽略
- 后续所有函数直接通过列名访问元素,完全不需要关心下标对应的数字
代码示例:
import numpy as np # 列名和你实际的7列顺序一一对应即可 rates_dtype = np.dtype([ ('trade_date', 'datetime64[D]'), ('open', 'f8'), ('low', 'f8'), ('close', 'f8'), ('high', 'f8'), ('volume', 'i8'), ('turnover', 'f8') ]) # 一次性转换原有数据(数据加载阶段做一次即可) rates = np.loadtxt(data_file, dtype=rates_dtype)
转换完成后,你原有的判断逻辑可以直接替换为可读性极强的具名写法,和你期望的rates[-1][high]访问效果完全一致:
# 原硬编码写法 if ( rates[-1][4] > rates[-1][1] and rates[-2][4] > rates[-2][1] and rates[-1][4] > rates[-2][4] ): # 替换为具名访问写法 if ( rates[-1]['high'] > rates[-1]['open'] and rates[-2]['high'] > rates[-2]['open'] and rates[-1]['high'] > rates[-2]['high'] ):
方案二:全局常量类封装(零改动现有数组结构)
如果不想调整现有普通数组的加载逻辑,可以将所有列的下标封装为统一的常量类,仅在公共模块中定义一次,所有用到数组的函数直接导入引用即可,无需重复定义单变量常量。
代码示例:
# 公共模块中仅维护一次列下标 class RatesIndex: OPEN = 1 HIGH = 4 LOW = 2 CLOSE = 3 VOLUME = 5 TURNOVER = 6 # 所有业务函数中直接导入使用 from common import RatesIndex if ( rates[-1][RatesIndex.HIGH] > rates[-1][RatesIndex.OPEN] and rates[-2][RatesIndex.HIGH] > rates[-2][RatesIndex.OPEN] and rates[-1][RatesIndex.HIGH] > rates[-2][RatesIndex.HIGH] ):
这个方案的优势是完全兼容你现有的普通数组写法,仅需要把硬编码的数字替换为类属性引用,后续如果列顺序调整,只需要修改常量类中的数值即可,不需要全局搜索替换硬编码的下标。
方案三:Pandas DataFrame(项目已依赖Pandas时优先)
如果你的开发环境已经安装了Pandas,直接将数组转换为带列名的DataFrame即可获得天然的具名列访问能力,列名和数据集绑定,无需重复定义下标。
代码示例:
import pandas as pd # 一次性指定列名完成转换 rates_df = pd.DataFrame(rates, columns=['trade_date', 'open', 'low', 'close', 'high', 'volume', 'turnover']) # 后续直接用具名列访问即可 if ( rates_df.iloc[-1]['high'] > rates_df.iloc[-1]['open'] and rates_df.iloc[-2]['high'] > rates_df.iloc[-2]['open'] and rates_df.iloc[-1]['high'] > rates_df.iloc[-2]['high'] ):
内容的提问来源于stack exchange,提问作者Francois Paulsen
相关产品推荐
相关产品推荐

