ND4J INDArray切片是通过获取Nd4j数组的任意片段-堆栈溢出中的一个重载get()方法实现的。由于INDArray需要一个连续的本地内存块,使用get()的切片是否会复制原始内存(尤其是行切片,其中可能使用相同的支持内存创建一个新的INDArray )?
我找到了另一个INDArray方法subArray()。这个有什么区别吗?
我之所以这样问,是因为我试图创建一个可以直接从INDArray中提取数据的INDArray,并且我希望消除可能的开销。源代码中有太多的抽象,我自己也找不到实现。
有关NumPy的类似问题在python :视图vs切片复制-堆栈溢出中被问到,答案可以在索引- NumPy v1.16手册中找到。
这里的经验法则可以是:在lvalue索引的上下文中(即索引放在赋值的左边值中),不创建数组的视图或副本(因为没有必要)。但是,对于常规值,上述创建视图的规则确实适用。
发布于 2019-05-13 09:16:08
简短的回答是:不,它是在可能的情况下使用参考。要复制一个副本,可以调用.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 out = myMatrix.transpose().dup()。在这个dup()调用之后,原始数组myMatrix和数组out之间将没有链接(因此,对其中一个的更改不会影响另一个)。
https://stackoverflow.com/questions/56092617
复制相似问题