Делает ли нарезка ND4J копию исходного массива? - PullRequest
0 голосов
/ 11 мая 2019

ND4J INDArray нарезка выполняется одним из перегруженных методов get(), как было дано в ответе java - Получить произвольный фрагмент массива Nd4j - Переполнение стека . Поскольку INDArray принимает непрерывный блок собственной памяти, выполняет ли срез с использованием get() копию исходной памяти (особенно срезание строк, в котором можно создать новый INDArray с той же резервной памятью)?

Я нашел другой INDArray метод subArray(). Это имеет какое-то значение?

Я спрашиваю об этом, потому что я пытаюсь создать DatasetIterator, который может напрямую извлекать данные из INDArray s, и я хочу устранить возможные издержки. В исходном коде слишком много абстракции, и я сам не смог найти реализацию.

Аналогичный вопрос о NumPy задается в python - Numpy: просмотры и копирование путем разрезания - Переполнение стека , а ответ можно найти в Индексация - NumPy v1.16 Manual :

Эмпирическое правило здесь может быть следующим: в контексте индексации lvalue (т. Е. Индексы размещаются в левом значении присваивания), представление или копия массива не создаются (поскольку нет необходимости ). Однако с обычными значениями вышеупомянутые правила для создания представлений действительно применяются.

1 Ответ

1 голос
/ 13 мая 2019

Короткий ответ: нет, он использует ссылку, когда это возможно. Чтобы сделать копию, можно вызвать функцию .dup().

Цитировать https://deeplearning4j.org/docs/latest/nd4j-overview

Просмотры: когда два или более NDArrays ссылаются на одни и те же данные

Ключевой концепцией в ND4J является тот факт, что два NDArrays могут фактически указывать на один и тот же лежащие в основе данные в памяти. Обычно у нас есть один NDArray со ссылкой на некоторое подмножество другого массива, и это происходит только наверняка операции (такие как INDArray.get (), INDArray.transpose (), INDArray.getRow () и т. Д. Это мощная концепция, которая стоит понять.

Для этого есть две основные причины:

Есть значительные преимущества в производительности, особенно в том, чтобы избежать копирование массивов Мы получаем много власти с точки зрения того, как мы можем выполнить операции с нашими NDArrays Рассмотрим простую операцию, например матрицу перенести на большую (10 000 х 10 000) матрицу. Используя представления, мы можем выполнить эту матрицу транспонировать в постоянное время без выполнения каких-либо копии (то есть O (1) в большой записи O), избегая значительных затрат копирование всех элементов массива. Конечно, иногда мы хотим сделать копию - в этот момент мы можем использовать INDArray.dup (), чтобы получить copy. Например, чтобы получить копию транспонированной матрицы, используйте INDArray out = myMatrix.transpose (). dup (). После этого вызова dup () будет нет связи между исходным массивом myMatrix и массивом (таким образом, изменение одного не повлияет на другое).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...