Na przykład, jeśli mamy numpy
tablicę A
i chcemy numpy
tablicy B
z takimi samymi elementami.
Jaka jest różnica między następującymi (patrz poniżej) metodami? Kiedy przydzielana jest dodatkowa pamięć, a kiedy nie?
B = A
B[:] = A
(tak samo jakB[:]=A[:]
?)numpy.copy(B, A)
but B = A[:] would do something more like 1
? Według tego stackoverflow.com/a/2612815new_list = old_list[:]
również jest kopią.some_array[:]
utworzy nowy obiekt tablicy, ale ten nowy obiekt będzie widokiem tej samej pamięci, co oryginalna tablica, która nie zostanie skopiowana. Dlatego powiedziałem, że bardziej przypominaB = A
. Zajmuje tylkoO(1)
przestrzeń i czas, a nie wszystko,O(n)
czego potrzebowałaby prawdziwa kopia.B=A
tworzy odniesienieB[:]=A
tworzy kopięnumpy.copy(B,A)
tworzy kopięostatnie dwa wymagają dodatkowej pamięci.
Aby zrobić głęboką kopię, musisz użyć
B = copy.deepcopy(A)
źródło
B[:] = A
czy nie zrobić głęboki kopii tablic obiektów typu, npA = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')
. Teraz spróbujB[:] = A; B[0][0]=99
, to zmieni pierwszy element zarówno w A, jak i B ! O ile mi wiadomo, nie ma innego sposobu na zagwarantowanie głębokiej kopii, nawet tablicy numpy, niżcopy.deepcopy
To jedyna działająca odpowiedź dla mnie:
źródło