我只是看下面的数据图表。
https://s3.amazonaws.com/assets.datacamp.com/blog_assets/Numpy_Python_Cheat_Sheet.pdf
我想知道np.copy(a)
和a.copy()
之间是否有区别-或者它们只是同一操作的同义词?
答案 0 :(得分:4)
如果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])]