Nim语言中能否用元组直接索引多维数组?有无更简洁写法?
更简洁的二维数组索引方法
好问题!确实,每次写a[p.x][p.y]有点繁琐,尤其是需要频繁索引的时候。这里有几种办法能让你像numpy那样用更简洁的方式索引:
1. 自定义可索引的数组包装类
如果你想完全实现类似numpy的a[p]语法,可以写一个简单的包装类,重载Python的__getitem__方法来识别你的Point元组:
from typing import NamedTuple # 先定义你的Point类型(用NamedTuple更符合Python的类型规范) class Point(NamedTuple): x: int y: int class SmartArray: def __init__(self, array): self.array = array def __getitem__(self, key): # 如果传入的是Point实例,直接用x和y索引二维数组 if isinstance(key, Point): return self.array[key.x][key.y] # 保留普通索引的功能,比如a[0]获取第一行 return self.array[key] # 使用示例 a = SmartArray([[1,2],[3,4]]) p = Point(1,1) print(a[p]) # 输出4,和a[p.x][p.y]效果一致
这个方法的好处是完全贴合你想要的a[p]语法,而且对原有代码的改动很小——只需要把普通数组换成SmartArray实例就行。
2. 轻量辅助函数
如果不想包装数组,写一个简单的辅助函数也能减少重复代码:
from typing import NamedTuple class Point(NamedTuple): x: int y: int def get(arr, point): return arr[point.x][point.y] # 使用示例 a = [[1,2],[3,4]] p = Point(1,1) print(get(a, p)) # 输出4
这种方式更轻量,不需要额外的类,适合偶尔需要索引的场景。
3. 直接用numpy数组(如果适用)
既然你提到了numpy,其实numpy的多维数组本身就支持元组索引。如果你的场景本来就适合用numpy,直接把普通列表转成numpy数组就行:
import numpy as np from typing import NamedTuple class Point(NamedTuple): x: int y: int a_np = np.array([[1,2],[3,4]]) p = Point(1,1) # 把Point转成元组就能直接索引 print(a_np[tuple(p)]) # 输出4 # 如果用普通元组的话更直接:p = (1,1),然后a_np[p]
numpy的数组本身就设计用来支持这种多维索引,如果你需要做更多数值计算,直接用numpy会更省心。
内容的提问来源于stack exchange,提问作者Imran
相关产品推荐
相关产品推荐

