【问题标题】:Combining numpys fancy indexing with slicing将 numpys 花式索引与切片相结合
【发布时间】:2018-10-12 14:04:47
【问题描述】:

我目前有一个形状为(m, n) 的二维numpy 数组。此外,我有两个(m, p) 索引数组i1i2。索引总是连续的!

import numpy as np
t = np.array([[-1, -1,  0,  0,  1,  2,  2],
              [-1, -1,  0,  1,  2,  3,  3],
              [0,  0,  1,  2,  2,  3,  3]])

i1 = np.array([3, 2, 2])
i2 = np.array([4, 3, 3])

如何使用数组i1i2t 进行切片以获得以下子矩阵?

expected_t = np.array([
                      [0, 1],
                      [0, 1],
                      [1, 2]
])

那是

expected_t[0, :] = t[0, i1[0]:i2[0]]
expected_t[1, :] = t[1, i1[1]:i2[1]]
expected_t[2, :] = t[2, i1[2]:i2[2]]

此外,是否可以通过创建视图而不复制数据来做到这一点?

提前感谢所有帮助!

【问题讨论】:

  • 我认为这本机是不可能的。如果确实需要复制,您是否正在寻找解决方案?

标签: python numpy matrix-indexing


【解决方案1】:

在 numpy 中使用精美的索引:

t[np.arange(3).reshape(3,1), np.vstack((i1,i2)).T]

t[np.arange(3), np.vstack((i1,i2))].T

两者都会有结果:

array([[0, 1],
   [0, 1],
   [1, 2]])

【讨论】:

    【解决方案2】:

    我建议这样做,但我不知道它是否存在按照示例进行索引的最快方法:

    import numpy as np
    t = np.array([[-1, -1,  0,  0,  1,  2,  2],
                  [-1, -1,  0,  1,  2,  3,  3],
                  [0,  0,  1,  2,  2,  3,  3]])
    
    i1 = np.array([3, 2, 2])
    i2 = np.array([4, 3, 3])
    
    output = [] 
    for i, (min_, max_) in enumerate(zip(i1, i2)):
        output.append(t[i, min_:max_+1])
    
    expected_t = np.array(output)
    

    或更短:

    expected_t = np.array([t[i, j:k+1] for (i,j,k) in zip(range(len(t)), i1, i2)])
    

    【讨论】:

    • 值得注意的是,这不满足 OP 输出视图的标准(并不是说我相信这是可能的)。
    • 是的,但我也不认为以这种方式可以直接查看数组。
    猜你喜欢
    • 1970-01-01
    • 2022-07-21
    • 2021-11-19
    • 2018-07-29
    • 2020-04-07
    • 1970-01-01
    • 2021-01-13
    • 2021-04-17
    相关资源
    最近更新 更多