Jawaban:
Ketiga versi melakukan hal yang berbeda:
B = A
Ini mengikat nama baru B
ke 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 A
ke 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 B
array 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[:] = A
tidak 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