Назначение массива с копией

Например, если у нас есть numpy массив A, и мы хотим получить numpy массив B с теми же элементами.

В чем разница между следующими (см. Ниже) методами? Когда выделяется дополнительная память, а когда нет?

  1. B = A
  2. B[:] = A (так же, как B[:]=A[:]?)
  3. numpy.copy(B, A)

Ответ 1

Все три версии делают разные вещи:

  1. B = A

    Это связывает новое имя B с существующим объектом, уже названным A После этого они ссылаются на один и тот же объект, поэтому, если вы измените один на месте, вы увидите изменение и через другой.

  2. B[:] = A (так же, как B[:]=A[:]?)

    Это копирует значения из A в существующий массив B Два массива должны иметь одинаковую форму, чтобы это работало. B[:] = A[:] делает то же самое (но B = A[:] делает что-то более похожее на 1).

  3. numpy.copy(B, A)

    Это недопустимый синтаксис. Вы, вероятно, имели в виду B = numpy.copy(A). Это почти то же самое, что и 2, но он создает новый массив, а не повторно использует массив B Если бы не было никаких других ссылок на предыдущее значение B, конечный результат был бы таким же, как 2, но он будет временно использовать больше памяти во время копирования.

    Или, может быть, вы имели в виду numpy.copyto(B, A), который является законным и эквивалентен 2?

Ответ 2

  1. B=A создает ссылку
  2. B[:]=A делает копию
  3. numpy.copy(B,A) делает копию

последние два требуют дополнительной памяти.

Чтобы сделать глубокую копию, вам нужно использовать B = copy.deepcopy(A)

Ответ 3

Это единственный рабочий ответ для меня:

B=numpy.array(A)