Відповіді:
Усі три версії роблять різні речі:
B = A
Це пов'язує нове ім'я B
з уже названим об'єктом A
. Потім вони посилаються на один і той же об’єкт, тож якщо ви модифікуєте один на місці, ви побачите зміни і через інший.
B[:] = A
(те саме, що B[:]=A[:]
?)
Це копіює значення з A
існуючого масиву B
. Два масиви повинні мати однакову форму для цього. B[:] = A[:]
робить те ж саме (але B = A[:]
зробив би щось більше, як 1).
numpy.copy(B, A)
Це не юридичний синтаксис. Ви , ймовірно , мав в виду B = numpy.copy(A)
. Це майже те саме, що і 2, але він створює новий масив, а не повторно використовує B
масив. Якщо б не було інших посилань на попереднє B
значення, кінцевий результат буде таким самим, як 2, але він буде використовувати більше пам'яті тимчасово під час копіювання.
А може, ви мали на увазі numpy.copyto(B, A)
, що є законним і еквівалентно 2?
but B = A[:] would do something more like 1
? Відповідно до цього stackoverflow.com/a/2612815 new_list = old_list[:]
також є копією.
some_array[:]
, створить новий об’єкт масиву, але цей новий об'єкт буде виглядом тієї самої пам'яті, що і вихідний масив, який не буде скопійовано. Тому я сказав, що це більше схоже B = A
. Це займає лише O(1)
простір та час, а не O(n)
кожну справжню копію.
B=A
створює довідкуB[:]=A
робить копіюnumpy.copy(B,A)
робить копіюостанні два потребують додаткової пам'яті.
Щоб зробити глибоку копію, вам потрібно скористатися B = copy.deepcopy(A)
B[:] = A
це НЕ робить глибоку копію масивів об'єктів типу, наприклад A = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')
. Тепер спробуйте B[:] = A; B[0][0]=99
, це змінить перший елемент і в А, і в В ! Наскільки мені відомо, немає іншого способу гарантувати глибоку копію, навіть нумерованого масиву, ніжcopy.deepcopy