我对python编程非常熟悉,但是我发现以下两行代码提供不同结果的奇怪情况(假设两个数组是二维的):
A[:][:] = B[:][:]
和
A[:,:] = B[:,:]
我想知道是否有任何情况,
有任何提示吗?
示例:
>>> x = numpy.array([[1, 2], [3, 4], [5, 6]])
>>> x
array([[1, 2],
[3, 4],
[5, 6]])
>>> x[1][1]
4 # expected behavior
>>> x[1,1]
4 # expected behavior
>>> x[:][1]
array([3, 4]) # huh?
>>> x[:,1]
array([2, 4, 6]) # expected behavior
答案 0 :(得分:1)
让我们退后一步。试试这个:
>>> x = np.arange(6)
>>> x
array([0, 1, 2, 3, 4, 5])
>>> x[:]
array([0, 1, 2, 3, 4, 5])
>>> x[:][:]
array([0, 1, 2, 3, 4, 5])
>>> x[:][:][:][:][:][:][:][:][:][:]
array([0, 1, 2, 3, 4, 5])
看起来x[:]
等于x
。 (实际上,x[:]
创建了x
的副本。)
因此,x[:][1] == x[1]
。
这符合我们的期望吗?为什么x[:]
是x
的副本?如果您熟悉切片,请通过以下示例进行说明:
>>> x[0:4]
array([0, 1, 2, 3])
>>> x[0:6]
array([0, 1, 2, 3, 4, 5])
>>> x[0:]
array([0, 1, 2, 3, 4, 5])
>>> x[:]
array([0, 1, 2, 3, 4, 5])
我们可以省略0
和6
,而numpy会找出对我们来说最大的尺寸。
关于问题的第一部分,要创建B
的副本,您可以执行以下任一操作:
A = B[:, :]
A = B[...]
A = np.copy(B)