繁体   English   中英

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

[英]What is the difference in NumPy between [:][:] and [:,:]?

我对 python 编程非常熟悉,但是我发现了一些奇怪的情况,其中以下两行代码提供了不同的结果(假设两个 arrays 是二维的):

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

让我们退后一步。 尝试这个:

>>> 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)

通常,我们使用像x,y这样的坐标,首先是水平坐标,然后是垂直坐标。 因此, numpy通过按此顺序给出两个坐标,可以方便地访问 2D arrays 中的元素。

但是,二维数组实际上是 arrays 的数组; 注意定义:

foo = numpy.array([
    [1, 2],
    [3, 4],
    [5, 6]
])

如果忽略numpy.array构造函数,这是一个列表列表。 外部列表包含三个元素(每个元素都是一个列表),索引 1 处的值是foo[1] == [3, 4] 这是有道理的,因为矩阵表示为rows列表,因此外部列表中使用的索引控制垂直坐标,即您访问的行。

因此,在像foo[1][0] == 3这样的表达式中,索引 1 是垂直坐标,而 0 是水平坐标。 也就是说,它相当于写foo[x,y] 与通常的约定相比,它是倒退的,但它从逻辑上遵循矩阵是行列表这一事实。 如果矩阵是列列表,则foo[x][y]将是正确的。

对于numpy arrays,这同样适用于切片运算符。 表达式foo[:][1]等价于foo[1,:] ,而不是foo[:,1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM