Відповіді:
Усі три версії роблять різні речі:
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