ND4J切片是否可以制作原始数组的副本



nd4j INDArray切片是通过Java中回答的一个过载的get()方法之一来实现的 - 获得ND4J数组的任意切片 - 堆栈溢出。由于INDArray占据了本机内存的连续块,使用get()切片是否制作原始内存的副本(尤其是行切片,其中可能在其中创建一个具有相同备份内存的新INDArray(?

(?

我找到了另一种INDArray方法subArray()。这有什么区别吗?

我之所以问这个,是因为我正在尝试创建一个可以直接从INDArray s提取数据的DatasetIterator,并且我想消除可能的开销。源代码中的抽象太多,我自己找不到实现。

在python -numpy中问了一个关于numpy的类似问题:视图与切片 - 堆栈溢出,答案可以在索引中找到 - numpy v1.16手册:

这里的经验法则可以是:在LVALUE索引的上下文中(即,将索引放置在分配的左手侧值中(,没有创建数组的视图或副本(因为无需(。但是,具有固定的值,上述创建视图的规则确实适用。

简短的答案是:否在可能的情况下使用参考。要制作副本,可以调用.dup()函数。

引用https://deeplearning4j.org/docs/latest/nd4j-overview

视图:当两个或多个ndarrays参考相同的数据

ND4J中的一个关键概念是两个Ndarrays实际上可以指向相同的事实 内存中的基础数据。通常,我们有一个ndarray 另一个数组的某个子集,这仅在某些地方发生 操作(例如indarray.get((,indarray.transpose((, indarray.getrow((等。这是一个有力的概念,一个是 值得理解。

有两个主要动机:

具有相当大的性能优势,最著名的是避免 复制阵列我们就如何执行方面获得了很大的力量 在我们的ndarrays上的操作考虑了一个简单的操作,例如矩阵 在大型(10,000 x 10,000(矩阵上转置。使用视图,我们可以 在恒定时间内执行此矩阵转置,而无需执行任何 副本(即o(1(大o符号(,避免了相当大的成本 复制所有数组元素。当然,有时我们确实想 制作副本 - 在此时,我们可以使用indarray.dup((获取一个 复制。例如,要获取转移矩阵的副本 out = mymatrix.transpose((。dup((。dup((呼叫后,会有 原始数组mymatrix和阵列之间没有链接(因此, 更改对另一个不会影响另一个。

最新更新