一,NumPy数组跟列表最重要的区别在于,数组切片是原始数组的视图。
这意味着数据不会被复制,视图上的任何修改都会直接反映到源数据上。
如果你想要得到的是ndarray切片的一份副本而非视图,就需要显示地进行复制操作,例如arr[5:8].copy()
例子:
>>> import numpy as np
>>> arr = np.arange(10)
>>> arr[5:8] = 0
>>> arr
array([0, 1, 2, 3, 4, 0, 0, 0, 8, 9])
二,通过布尔型索引选取数组中的数据,将总是创建数据的副本,即使返回一模一样的数组也是如此。
例子:
>>> arr = np.arange(3)
>>> arr
array([0, 1, 2])
>>> arr > 1
array([False, False, True], dtype=bool)
>>> arr[arr > 1] = 0
>>> arr
array([0, 1, 0])
竟然源数组改变了!原因尚不清楚。难道教材错了吗?明明是视图呀?
三,布尔型DataFrame索引是原始DataFrame的视图。
例子:
>>> dt = pd.DataFrame(np.arange(16).reshape((4,4)))
>>> dt < 5
0 1 2 3
0 True True True True
1 True False False False
2 False False False False
3 False False False False
>>> dt[dt < 5] = 0
>>> dt
0 1 2 3
0 0 0 0 0
1 0 5 6 7
2 8 9 10 11
3 12 13 14 15