我正在查看一些numpy代码,并遇到了此问题。 numpy对于1维数组和2维数组表现出不同的行为。在第一种情况下,它将创建引用,而在第二种情况下,它将创建深层副本。
这是代码段
import numpy as np
# Case 1: when using 1d-array
arr = np.array([1,2,3,4,5])
slice_arr = arr[:3] # taking first three elements, behaving like reference
slice_arr[2] = 100 # modifying the value
print(slice_arr)
print (arr) # here also value gets changed
# Case 2: when using 2d-array
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
slice_arr = arr[:,[0,1]] # taking all rows and first two columns, behaving like deep copy
slice_arr[0,1] = 100 # modifying the value
print(slice_arr)
print() # newline for clarity
print (arr) # here value doesn't change
有人可以解释这种现象的原因吗?
答案 0 :(得分:4)
原因是您不是以相同的方式进行切片,而不是1D与2D。
slice_arr = arr[:3]
在这里,您使用的是切片运算符,因此numpy可以查看原始数据并将其返回。
slice_arr = arr[:,[0,1]]
在这里,您使用的是所需元素的列表,它不是一个切片(即使可以用切片表示),在这种情况下,numpy返回一个副本。
所有这些都是吸气剂,因此它们可以返回视图或副本。
对于设置方法,它总是在修改当前数组。