Misalnya, jika kita memiliki numpy
array A
, dan kita menginginkan numpy
array B
dengan elemen yang sama.
Apa perbedaan antara metode berikut (lihat di bawah)? Kapan memori tambahan dialokasikan, dan kapan tidak?
B = A
B[:] = A
(sama sepertiB[:]=A[:]
?)numpy.copy(B, A)
but B = A[:] would do something more like 1
? Menurut stackoverflow.com/a/2612815new_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 sepertiB = A
. Ini hanya membutuhkanO(1)
ruang dan waktu, bukanO(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)
sumber
B[:] = A
tidak tidak membuat salinan yang mendalam dari array dari objek-jenis, misalnyaA = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')
. Sekarang cobaB[:] = 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
Ini adalah satu-satunya jawaban yang berfungsi untuk saya:
sumber