【问题标题】:Python numpy indexPython numpy 索引
【发布时间】:2014-06-13 18:55:55
【问题描述】:

我有一个像这样的 numpy 数组 p:

array([[ 0.92691702,  0.07308298],
   [ 0.65515095,  0.34484905],
   [ 0.32526151,  0.67473849],
   ..., 
   [ 0.34171992,  0.65828008],
   [ 0.77521514,  0.22478486],
   [ 0.96430103,  0.03569897]])

如果我做 x=p[:,1:2],我会得到 ​​p>

array([[ 0.07308298], [ 0.34484905], [ 0.67473849], ..., [ 0.65828008], [ 0.22478486], [ 0.03569897]]) x.shape 是 (5500,1)

但是,如果我执行 x=p[:,1],我会得到 ​​p>

array([ 0.07308298,  0.34484905,  0.67473849, ...,  0.65828008,
    0.22478486,  0.03569897])

x.shape 是 (5500, )

为什么会有这样的差异?这让我很困惑。提前感谢大家的帮助。

【问题讨论】:

  • 与列表相同:[1,2,3][1][1,2,3][1:2] 不同。先试着理解这个例子。

标签: python arrays numpy slice


【解决方案1】:

这是在ndarray.__getitem__ 调用中使用切片和单个整数的区别。切片导致 ndarray 返回 "views",而整数导致 ndarray values

我在这里的术语有点松散——真的,对于你的情况,它们都返回一个 numpy 视图——首先考虑一维情况更容易:

>>> import numpy as np
>>> x = np.arange(10)
>>> x[1]
1
>>> x[1:2]
array([1])

这个想法很好地扩展到多个维度——如果你传递一个特定轴的切片,你将沿着该轴获得“类似数组”的值。如果您传递特定轴的标量,您将在结果中获得沿该轴的标量。

请注意,一维案例与标准 python list 的行为方式实际上没有任何不同:

>>> x = [1, 2, 3, 4]
>>> x[1]
2
>>> x[1:2]
[2]

【讨论】:

  • 这里重要的不是视图/价值的区别;这是项目/子序列的区别。事实上,这两个操作都返回了这种情况下的视图。
  • @user2357112 -- 你当然是对的。我试图与一维案例进行类比,但我想我不够明确。已更新。
  • 谢谢大家,你们的回答真的很有帮助,我现在明白了。如果我使用切片,我会得到一个子序列,如果我使用整数,我只会得到项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 2019-06-02
  • 1970-01-01
  • 2021-11-17
  • 2021-10-29
  • 2016-02-21
  • 2012-07-14
相关资源
最近更新 更多