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

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张量再做索引:

  1. 取单个维度对应的值
    比如取所有行中x维度索引为1的列,直接用Access语法即可:
    iex> tensor[x: 1]
    #Nx.Tensor<
      s64[y: 2]
      [2, 4]
    >
    
    取y维度索引为0的整行:
    iex> tensor[y: 0]
    #Nx.Tensor<
      s64[x: 2]
      [1, 2]
    >
    
  2. 取维度切片
    如果是0.5以上的新版本Nx,直接传Range即可:
    iex> tensor[y: 0..1]
    #Nx.Tensor<
      s64[y: 2][x: 2]
      [
        [1, 2],
        [3, 4]
      ]
    >
    
    如果是老版本Nx,用官方提供的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:57:16