【问题标题】:Difference between array[i][:] and array[i,:]array[i][:] 和 array[i,:] 的区别
【发布时间】:2017-10-16 06:35:11
【问题描述】:

我是 python 新手,所以我习惯使用array[i][j] 而不是array[i,j]。今天,我根据教程创建的脚本无法正常工作,直到我发现我正在使用

numpy.dot(P[0][:], Q[:][0])

而不是

numpy.dot(P[0,:], Q[:,0])

由于某种原因,第二个有效,而第一个给了我一个形状错误。矩阵维度为 MxK 和 KxN。

我尝试同时打印P[0][:]P[0,:],运行id()type()P[0][:].shape,但找不到原因。为什么这些东西不同?

我在 Jupyter Notebook 4.3.0 和 Python 2.7.13 上运行它。

【问题讨论】:

标签: python arrays numpy indexing


【解决方案1】:

在处理 numpy 数组时,您几乎应该总是使用 [i, j] 而不是 [i][j]。在许多情况下没有真正的区别,但在你的情况下是有的。

假设你有一个这样的数组:

>>> import numpy as np
>>> arr = np.arange(16).reshape(4, 4)
>>> arr 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

当您使用[:] 时,这相当于一个新视图,但如果您使用[1, :][:, 1],则意味着获得第二行(列)。粗略地说,它的意思是:索引你有数字的维度,并留下你有:的维度:

>>> arr[:]
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

>>> arr[:, 1]  #  get the second column
array([ 1,  5,  9, 13])
>>> arr[:][1]  # get a new view of the array, then get the second row
array([4, 5, 6, 7])

这是因为[1] 被解释为[1, ...]... 是省略号对象),而对于 2D,它相当于[1, :]

这也是行索引仍然有效的原因(因为它是第一个维度):

>>> arr[1, :]  # get the second row
array([4, 5, 6, 7])
>>> arr[1][:]  # get the second row, then get a new view of that row
array([4, 5, 6, 7])

【讨论】:

  • [:] 是列表的副本,但不是数组。它在带有数组的 RHS 上很少有用
【解决方案2】:

x[:] 制作一个列表的浅表副本,但当x 是一个数组时几乎没有用。它创建了一个新的view - 相同的数据和形状,但不同的数组对象。如果这令人困惑,您需要查看一些关于视图和副本的基本 numpy 文档。

A[0,:]A[:, 1:5] 等二维数组中,: 是一种占位符,标识将作为一个整体使用的维度。 : 被 Python 解释器转换为 slice(None,None,None),而 start:stop:step 产生 slice(start, stop, step)

A[0,:],可以缩写为A[0],意思是选择A的第一“行”,以及它的所有“列”。该动作泛化到更高维度,其中行和列等名称的直观含义较不直观。

A[:,0] 表示选择第 0 列和所有行。

A[0][:] 扩展为A[0,:][:],意味着将[:] 应用于A[0,:] 的结果,实际上,只需查看第一行(这是一个一维数组)。

A[:][0]A[:,0]不一样;与A[0,:] 相同。 A[:]A[:,:] 相同,是整个二维数组的视图。

如果有帮助,我可以将索引表达式扩展为对A.__getitem__(...) 的调用。每组[] 都是一个单独的扩展。

在表达式A[:] = ... 中,[:] 很重要,但这是另一个主题。


这两个表达式是等价的:

numpy.dot(P[0][:], Q[:][0])
numpy.dot(P[0,:], Q[0,:])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2020-12-28
    • 2011-07-27
    • 1970-01-01
    相关资源
    最近更新 更多