Numpy-一维和二维数组的不同行为



我在查看一些numpy代码时遇到了这个问题。numpy在一维阵列和二维阵列中表现出不同的行为。在第一种情况下,它创建一个引用,而在第二种情况下则创建一个深度副本。

这是的代码片段

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

有人能解释这种行为的原因吗?

原因是您没有以相同的方式进行切片,这与1D与2D无关。

slice_arr = arr[:3]

这里您使用的是切片运算符,因此numpy可以查看原始数据并返回它

slice_arr = arr[:,[0,1]]

在这里,您使用的是所需元素的列表,而它不是切片(即使它可以用切片表示(,在这种情况下,numpy返回一个副本。

所有这些都是getter,所以它们可以返回view或copy。

对于setter,它总是在修改当前数组。

最新更新