【问题标题】:Generating indices using np.triu_indices使用 np.triu_indices 生成索引
【发布时间】:2013-06-26 11:27:18
【问题描述】:

我想在上三角矩阵的每个条目上调用一个函数。为了避免 for 循环的混乱嵌套,我使用了 numpy.triu_indices 函数。我的功能有效,但我想知道是否有更简洁的方法来实现索引。

import numpy as np
def weighted_edges(adjmat):
    indices = np.triu_indices(len(adjmat))
    return ((x, y, adjmat[x,y]) for (x,y) in zip(indices[0], indices[1]))

我怀疑有一种方法可以实现这一点,而无需在 zip 调用中引用 indices[i]。真的有办法吗?

【问题讨论】:

    标签: python numpy indices


    【解决方案1】:

    如果您有一个 N x N 矩阵,您希望从中获取上三角值,那么就这样做

    import numpy as np
    N = 5
    x = np.arange(N**2).reshape(N, N)
    upper = x[np.triu_indices(N, 0)]
    

    如果您希望三角形值从主对角线偏移k 列,然后执行

    upper = x[np.triu_indices(N, k)]
    

    【讨论】:

    • 唯一剩下的与 OP 函数返回的相同,是将三个数组堆叠在一起并转置它们:np.vstack(indices+(adjmat[indices],)).T
    • 非常感谢。 @Jaime:这正是我需要完成的。我正在努力理解 + 操作。 indices + adjmat[indices] 给了我一个我理解的结果,但我不明白为什么 indices + (adjmat[indices],) 执行联合,而不是向量加法(不向索引中的第二个数组添加任何内容)。
    • @EricKightleynp.triu_indices 返回的是一个 2 元素元组,包含两个数组,一个用于索引行,另一个用于列。 np.vstack 需要一个数组的元组(或列表)来堆叠,因此通过将单个元素元组 (adjmat[indices,) 添加到 indices 元组,我们将它们连接起来并创建一个三元素元组,该元组被堆叠,然后转置为适合您的原始输出。
    猜你喜欢
    • 2016-03-14
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2020-12-03
    • 2018-01-13
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多