[:] [:]和[:,:]之间的NumPy有什么区别?

时间:2019-11-13 22:07:34

标签: python arrays numpy numpy-ndarray numpy-slicing

我对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

1 个答案:

答案 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])

我们可以省略06,而numpy会找出对我们来说最大的尺寸。


关于问题的第一部分,要创建B副本,您可以执行以下任一操作:

A = B[:, :]
A = B[...]
A = np.copy(B)