【问题标题】:Numpy array of multiple indices replace with a different matrix多个索引的 Numpy 数组替换为不同的矩阵
【发布时间】:2017-03-26 21:08:00
【问题描述】:

我有一个二维索引数组。

indices = [[2,4], [6,77], [102,554]]

现在,我有一个不同的 4 维数组 arr,我只想提取一个数组(它是一个数组,因为它是 4 维的),并在索引数组中具有相应的索引。相当于下面的代码。

for i in range(len(indices)):
    output[i] = arr[indices[i][0], indices[i][1]]

但是,我意识到使用显式 for 循环会产生缓慢的结果。有没有我可以使用的内置 numpy API?此时,我尝试使用 np.choose、np.put、np.take,但没有成功产生我想要的结果。谢谢!

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    我们需要用索引中的两列索引前两个轴(将其视为一个数组)。

    因此,只需转换为数组和索引,就像这样 -

    indices_arr = np.array(indices)
    out = arr[indices_arr[:,0], indices_arr[:,1]]
    

    或者我们可以直接提取它们而不转换为数组然后索引 -

    d0,d1 = [i[0] for i in indices], [i[1] for i in indices]
    out = arr[d0,d1]
    

    另一种提取元素的方法是转换为元组,就像这样 -

    out = arr[tuple(indices_arr.T)]
    

    如果indices 已经是一个数组,请跳过转换过程并在我们有indices_arr 的地方使用indices

    【讨论】:

    • 第一种方法比使用显式for循环快吗?
    • @AverageAlgorithmGuy 如果您已经将indices 作为数组,我会采用第一种方法,否则采用第二种方法。
    【解决方案2】:

    尝试使用 numpy 数组的 take 函数。你的代码应该是这样的:

    outputarray= np.take(arr,indices)
    

    【讨论】:

    • 来自the numpy docs:“如果索引不是一维的,则输出也有这些维度。”这意味着它将返回[[arr[indices[0][0]], arr[indices[0][1]], ...], [arr[indices[1][0]], arr[indices[1][1]], ...], ...]
    猜你喜欢
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多