【问题标题】:Does ND4J slicing make a copy of the original array?ND4J 切片是否会复制原始数组?
【发布时间】:2019-09-29 05:59:15
【问题描述】:

ND4J INDArray 切片是通过java - Get an arbitrary slice of a Nd4j array - Stack Overflow 中回答的重载get() 方法之一实现的。当INDArray 占用一个连续的本地内存块时,使用get() 进行切片是否会复制原始内存(尤其是行切片,其中可以使用相同的后备内存创建一个新的INDArray)?

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

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

python - Numpy: views vs copy by slicing - Stack Overflow有类似的关于NumPy的问题,在Indexing — NumPy v1.16 Manual可以找到答案:

这里的经验法则可以是:在左值索引的上下文中(即索引放置在赋值的左侧值中),不会创建数组的视图或副本(因为不需要)。但是,对于常规值,上述创建视图的规则确实适用。

【问题讨论】:

    标签: slice deeplearning4j dl4j nd4j


    【解决方案1】:

    简短的回答是:不,它尽可能使用参考。要制作副本,可以调用 .dup() 函数。

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

    视图:当两个或多个 NDArray 引用相同的数据时

    ND4J 中的一个关键概念是两个 NDArrays 实际上可以指向同一个 内存中的底层数据。通常,我们有一个 NDArray 指 另一个数组的某个子集,这只发生在某些情况下 操作(如 INDArray.get()、INDArray.transpose()、 INDArray.getRow() 等。这是一个强大的概念,它是 值得理解。

    这样做有两个主要动机:

    有相当大的性能优势,最显着的是避免 复制数组我们在如何执行方面获得了很多权力 对我们的 NDArray 进行操作 考虑一个简单的操作,如矩阵 在大型 (10,000 x 10,000) 矩阵上转置。使用视图,我们可以 在恒定时间内执行此矩阵转置而不执行任何 复制(即大 O 表示法中的 O(1)),避免了可观的成本 复制所有数组元素。 当然,有时我们确实想 制作一个副本——此时我们可以使用 INDArray.dup() 来获得一个 复制。 例如,要获取转置矩阵的副本,请使用 INDArray out = myMatrix.transpose().dup()。在这个 dup() 调用之后,会有 原始数组 myMatrix 和数组 out 之间没有链接(因此, 对其中一个的更改不会影响另一个)。

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 2016-08-26
      • 2021-11-18
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多