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

Deep Java Library中NDArray无法修改已有元素,如何解决?

修改DJL NDArray指定位置元素的解决方案

问题描述

我刚开始使用Deep Java Library(DJL)及其底层数组操作包ndarray,想要修改现有NDArray的第i个元素但失败了。尝试了文档里的set方法,运行代码后抛出java.lang.UnsupportedOperationException: Tensor cannot be modified after creation错误。

最小复现代码:

var manager = NDManager.newBaseManager();

var y = manager.create(new float[] {1, 2, 3, 4, 5});
System.out.println("y before modification: " + y);

y.set(new float[] {1, 100, 3, 4, 5});
System.out.println("y after setting the entire array: " + y);

// 此处抛出异常:"java.lang.UnsupportedOperationException: Tensor cannot be modified after creation"
y.set(new NDIndex("1"), 1000f);
System.out.println("y after setting the 1st element to 1000: " + y);

报错信息:

java.lang.UnsupportedOperationException: Tensor cannot be modified after creation

解决方案

这个报错的核心原因是:默认创建的NDArray是不可变张量,无法直接修改单个元素。要解决这个问题,你可以通过以下两种方式操作:

方法1:创建时指定允许修改

调用manager.create方法时,传入NDArrayOptions.allowModification(true)参数,让张量支持修改:

var manager = NDManager.newBaseManager();

// 创建允许修改的NDArray
var y = manager.create(new float[] {1, 2, 3, 4, 5}, NDArrayOptions.allowModification(true));
System.out.println("y before modification: " + y);

y.set(new NDIndex("1"), 1000f);
System.out.println("y after setting the 1st element to 1000: " + y);

方法2:通过可变视图修改

如果无法重新创建NDArray,可以先获取它的可变视图(调用mutable()方法),再修改元素:

var manager = NDManager.newBaseManager();

var y = manager.create(new float[] {1, 2, 3, 4, 5});
System.out.println("y before modification: " + y);

// 获取可变视图后修改元素
y.mutable().set(new NDIndex("1"), 1000f);
System.out.println("y after setting the 1st element to 1000: " + y);

补充说明

  • 你之前使用的y.set(new float[] {...})能生效,是因为这个方法是创建新的NDArray并替换原引用,并非直接修改原张量的内容。
  • NDIndex的索引是从0开始的,代码里的"1"对应的是数组的第二个元素(原数组中的2),注意索引对应关系。

内容的提问来源于stack exchange,提问作者waykiki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:05:34