【问题标题】:Use variable to indicate index range [duplicate]使用变量来指示索引范围[重复]
【发布时间】:2018-07-17 15:08:54
【问题描述】:

我想创建一个包含索引的列表,该索引将用于从另一个列表中获取元素。

一个简单的案例:

A = [5,6,7,8,9,10]    
b = 2:4  

然后我想做类似的事情

C = A[b]

这就像说 C = A[2:4]

我想稍后将其扩展到多维数组,例如 b = [2:4, 5:6],我可以简单地调用 A[b] 从 A 中提取多维数组。

【问题讨论】:

    标签: python arrays multidimensional-array


    【解决方案1】:

    您可以将b 定义为slice 对象来实现此目的:

    In[9]:
    A = [5,6,7,8,9,10]    
    b = slice(2,4)
    A[b]
    
    Out[9]: [7, 8]
    

    关于您的其他要求,我认为如果您创建一个包含 2 个 slice 对象的列表对象,那么它应该可以实现您想要的:

    In[18]:
    import numpy as np
    a = np.arange(100).reshape(10,10)
    b = [slice(1,3), slice(3,4)]
    a[b]
    
    Out[18]: 
    array([[13],
           [23]])
    

    【讨论】:

    • 如果b 是元组而不是列表,则第二种情况会更接近A[1:3, 3:4]。使用列表索引时,可能会有不同的类型反应。
    • @BlackJack 使用slicess 列表的列表索引在这种情况下不起作用,但 OP 没有提供示例,所以我假设一个 np 数组
    【解决方案2】:

    您可以使用直接 python 使用例如切片:

    >>> A = [5,6,7,8,9,10]    
    >>> b = slice(2,4)
    >>> A[b]
    [7, 8]
    

    但这并不能很好地扩展到 nd 数组。为此,我建议使用 numpy 的 np.s_ 函数,该函数完全符合您的要求,而无需为每个轴显式构造 slice

    >>> b = np.s_[2:4]
    >>> A[b]
    [7, 8]
    

    这很好地扩展到例如二维数组:

    >>> A = np.ones(10, 10)
    >>> b = np.s_[2:4, 5:6]
    >>> A[b]
    array([[ 1.],
           [ 1.]])
    

    【讨论】:

      猜你喜欢
      • 2020-04-01
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 2020-09-10
      • 2017-03-26
      • 2012-08-21
      • 2020-02-13
      • 1970-01-01
      相关资源
      最近更新 更多