Jawaban:
Ketiga versi melakukan hal yang berbeda:
B = A
Ini mengikat nama baru Bke objek yang sudah ada yang dinamai A. Setelah itu, mereka merujuk ke objek yang sama, jadi jika Anda memodifikasi satu tempat, Anda akan melihat perubahan melalui yang lain juga.
B[:] = A(sama seperti B[:]=A[:]?)
Ini menyalin nilai dari Ake dalam array yang ada B. Kedua larik harus memiliki bentuk yang sama agar ini berfungsi. B[:] = A[:]melakukan hal yang sama (tetapi B = A[:]akan melakukan sesuatu yang lebih seperti 1).
numpy.copy(B, A)
Ini bukan sintaks hukum. Anda mungkin bermaksud B = numpy.copy(A). Ini hampir sama dengan 2, tetapi ini membuat array baru, daripada menggunakan kembali Barray tersebut. Jika tidak ada referensi lain ke nilai sebelumnya B, hasil akhirnya akan sama dengan 2, tetapi akan menggunakan lebih banyak memori untuk sementara selama penyalinan.
Atau mungkin yang Anda maksud numpy.copyto(B, A), mana yang legal, dan setara dengan 2?
but B = A[:] would do something more like 1? Menurut stackoverflow.com/a/2612815 new_list = old_list[:] ini juga merupakan salinan.
some_array[:]akan membuat objek array baru, tetapi objek baru itu akan menjadi tampilan memori yang sama dengan array asli, yang tidak akan disalin. Itu sebabnya saya mengatakan itu lebih seperti B = A. Ini hanya membutuhkan O(1)ruang dan waktu, bukan O(n)setiap salinan yang sebenarnya dibutuhkan.
B=A membuat referensiB[:]=A membuat salinannumpy.copy(B,A) membuat salinandua yang terakhir membutuhkan memori tambahan.
Untuk membuat salinan dalam, Anda perlu menggunakan B = copy.deepcopy(A)
B[:] = Atidak tidak membuat salinan yang mendalam dari array dari objek-jenis, misalnya A = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O'). Sekarang coba B[:] = A; B[0][0]=99, ini akan mengubah elemen pertama di A dan B ! Sepengetahuan saya, tidak ada cara lain untuk menjamin salinan yang dalam, bahkan dari susunan yang numpy, selaincopy.deepcopy