【问题标题】:How in numpy get elements of matrix between two indices arrays?如何在 numpy 中获取两个索引数组之间的矩阵元素?
【发布时间】:2019-10-09 04:19:23
【问题描述】:

假设我有一个矩阵:

>> a = np.arange(25).reshape(5, 5)`
>> a
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

以及定义我要提取的矩阵元素范围的两个索引向量:

>> indices1 = np.array([0, 1, 1, 0, 0])
>> indices2 = np.array([2, 3, 3, 2, 2])

如您所见,每个对应索引之间的差值等于 2。

我想做这样的事情提取矩阵的一部分:

>> submatrix = a[indices1:indices2, :]

因此结果将是 2x5 矩阵:

>> submatrix
[[ 0  6  7  3  4],
 [ 5 11 12  8  9]]

据我所知,numpy 允许提供索引作为边界,但不允许提供数组,只能提供整数,例如a[0:2]

注意我要减去的不是子矩阵:

您是否知道索引 numpy 矩阵的其他方法,以便可以提供定义跨度的数组?目前我设法只使用 for 循环来做到这一点。

【问题讨论】:

  • 使用恒定长度切片,您可以通过针对 [[0],[1]] 数组广播起始数组来构造索引数组。
  • indices1indices2 之间的差异是否始终是一个常数?喜欢这里是2
  • SO上有很多非常相似的Q。例如,这是几天前的 2D 切片变体 stackoverflow.com/q/56207710/7207392
  • @Divakar 他们是,但我想如果有不需要这种约束并返回所有元素的解决方案会更好(但当然不是作为矩阵)
  • @PaulPanzer 我尽力了,但很难找到。我永远找不到你发布的那个,因为它使用不同的词来陈述问题并且缺少像indexing这样的标签。

标签: python numpy matrix indexing matrix-indexing


【解决方案1】:

供参考,最明显的循环(还是做了几个实验步骤):

In [87]: np.concatenate([a[i:j,n] for n,(i,j) in enumerate(zip(indices1,indices2))], ).reshape(-1,2).T   
Out[87]: 
array([[ 0,  6,  7,  3,  4],
       [ 5, 11, 12,  8,  9]])

利用恒定长度的广播索引:

In [88]: indices1+np.arange(2)[:,None]                                                                   
Out[88]: 
array([[0, 1, 1, 0, 0],
       [1, 2, 2, 1, 1]])
In [89]: a[indices1+np.arange(2)[:,None],np.arange(5)]                                                   
Out[89]: 
array([[ 0,  6,  7,  3,  4],
       [ 5, 11, 12,  8,  9]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    相关资源
    最近更新 更多