Elixir Nx获取张量行数据时报Range.fetch未定义错误
报错原因
- 核心问题是你执行索引操作时,
tensor变量绑定的根本不是你创建的Nx张量,而是1..4这个Range值。从报错栈可以直接看到,抛出错误的调用是Range.fetch(1..4, [x: 1]),说明你调用[x: 1]语法的主体是Range,不是Nx.Tensor结构体。
你贴的代码里索引操作的行号是iex(33),张量定义的行号是iex(37)——iex的行号是按执行顺序递增的,说明你跑索引语句的时候,Nx张量还没创建,tensor还存着之前赋值的1..4,而Range类型本身没有实现Access行为,自然会报函数未定义的错误,本质是你贴代码时把执行顺序弄反了。 - 补充:就算变量绑定正确,如果你用的Nx版本低于0.5,直接在索引里传Elixir原生Range也可能出兼容问题,早期版本对Range索引的支持不完善。
正确获取指定维度数据的方法
操作前先执行tensor |> is_struct(Nx.Tensor),确认返回true,保证变量确实是Nx张量再做索引:
- 取单个维度对应的值
比如取所有行中x维度索引为1的列,直接用Access语法即可:
取y维度索引为0的整行:iex> tensor[x: 1] #Nx.Tensor< s64[y: 2] [2, 4] >iex> tensor[y: 0] #Nx.Tensor< s64[x: 2] [1, 2] > - 取维度切片
如果是0.5以上的新版本Nx,直接传Range即可:
如果是老版本Nx,用官方提供的iex> tensor[y: 0..1] #Nx.Tensor< s64[y: 2][x: 2] [ [1, 2], [3, 4] ] >Nx.slice/4按命名维度切片即可,参数依次为张量、维度起始定位、切片长度:iex> Nx.slice(tensor, [y: 0], [y: 2]) #Nx.Tensor< s64[y: 2][x: 2] [ [1, 2], [3, 4] ] >
内容的提问来源于stack exchange,提问作者Chen Yu
相关产品推荐
相关产品推荐

