Если a
равно numpy.array
, результат будет таким же.Но если a
является чем-то другим, a.copy()
вернет тот же тип, что и a
, или потерпит неудачу в зависимости от его типа, а np.copy(a)
всегда вернет numpy.array
.Попробуйте, например, следующее:
import pandas as pd
for x in (list(range(3)), np.array(range(3)), pd.Series(range(3))):
print()
print(repr(x.copy()))
print(repr(np.copy(x)))
UPD: есть еще одно отличие.Оба метода имеют дополнительный аргумент order
, определяющий порядок памяти в копии с различными значениями по умолчанию.В np.copy
это 'K'
, что означает «Использовать порядок как можно ближе к оригиналу», а в ndarray.copy
это 'C'
(Использовать C-порядок).Например,
x = np.array([[1,2,3],[4,5,6]], order='F')
for y in [x, np.copy(x), x.copy()]:
print(y.flags['C_CONTIGUOUS'], y.flags['F_CONTIGUOUS'])
Напечатает
False True
False True
True False
И в обоих случаях копии являются глубокими в том смысле, что сами данные массива копируются, но мелкими в том смысле, что в случае объектамассивы сами объекты не копируются.Что можно продемонстрировать как
x = np.array([1, [1,2,3]])
y = x.copy()
z = np.copy(x)
y[1][1] = -2
z[1][2] = -3
print(x)
print(y)
print(z)
Все три напечатанные строки:
[1 list([1, -2, -3])]