【问题标题】:Index a numpy array using a tuple (or list) when len < ndim?当 len < ndim? 使用元组(或列表)索引 numpy 数组?
【发布时间】:2014-12-18 21:47:00
【问题描述】:

我有一个 3d numpy 数组,例如:

>>> A = np.arange(24).reshape(2,3,4)

我想根据轴 1 和轴 2 的一对坐标沿轴 0 拍摄一维切片:

>>> h = 1
>>> l = 2
>>> A[:,h,l]
array([ 6, 18])

到目前为止一切顺利。但是如果我的坐标对存储为一个元组或一个列表,而不是两个整数呢?我尝试了一些明显的选择,但无济于事:

>>> coords = (1,2)
>>> A[coords]
array([20, 21, 22, 23])
>>> A[:,coords]
array([[[ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23]]])
>>> A[...,coords]
array([[[ 1,  2],
        [ 5,  6],
        [ 9, 10]],

       [[13, 14],
        [17, 18],
        [21, 22]]])

我已经用谷歌搜索了这个并没有找到任何东西,但我完全有可能没有使用适当的术语进行搜索。所以,如果这是一个过于简单的问题,请道歉!

【问题讨论】:

  • 您需要将坐标解压缩到两个单独的数组中,最后两个轴各一个。例如。 h, l = coords。 (请注意,在这种情况下,coords 可能是二维的。)还是我误解了这个问题?

标签: python arrays numpy indexing


【解决方案1】:

您可以直接构造切片元组,例如:

In [11]: A[(slice(None),) + coords]
Out[11]: array([ 6, 18])

这是因为调用A[:, 1, 2] 等价于 / 调用:

In [12]: A.__getitem__((slice(None, None, None), 1, 2))
Out[12]: array([ 6, 18])

【讨论】:

  • 只是对 OP 的附注:它确实必须是切片的元组,而不仅仅是任何可迭代的。 Numpy 将以完全不同的方式解释传入的数组或列表。很好的解释!
  • 使用元组的谨慎是好的。但是,ind=[slice(None)]*3; ind[1:]=coords; A[ind] 也同样有效。 docs.scipy.org/doc/numpy/reference/arrays.indexing.html 中有一条关于保留与旧数字包的向后兼容性的注释(对于包含切片的列表)。
猜你喜欢
  • 2015-04-14
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多