Например, если у нас есть numpy
массив A
, и нам нужен numpy
массив B
с такими же элементами.
В чем разница между следующими (см. Ниже) методами? Когда выделяется дополнительная память, а когда нет?
B = A
B[:] = A
(так же, какB[:]=A[:]
?)numpy.copy(B, A)
but B = A[:] would do something more like 1
? Согласно этому stackoverflow.com/a/2612815new_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
, это изменит первый элемент как в A, так и в B ! Насколько мне известно, нет другого способа гарантировать глубокую копию, даже numpy-array, чемcopy.deepcopy
Для меня это единственный рабочий ответ:
источник