【问题标题】:What is the difference in NumPy between [:][:] and [:,:]?[:][:] 和 [:,:] 在 NumPy 中有什么区别?
【发布时间】:2020-03-09 19:08:05
【问题描述】:

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

【问题讨论】:

  • 一个是多维列表,另一个是锯齿状列表。见ict.social/python/basics/multidimensional-lists-in-python
  • @RobertHarvey 问题是关于numpy.ndarray 对象,真的,你不能仅仅从这里知道对象的类型,而且无论如何,python 列表没有“维度”。
  • 好吧,好吧。但这不是问题要问的。
  • @RobertHarvey 好吧,问题不是锯齿状,而是 numpy.ndarray 对象实现真正的多维数组,并且不能锯齿状。该链接非常糟糕,给人很多误导性的印象,即它试图将其伪装成不仅仅是有用的抽象,而是“技术上如何实现事物”。
  • 这个问题可以以现在的形式回答吗?

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


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2015-05-09
    • 2013-01-03
    • 2017-05-29
    相关资源
    最近更新 更多