【问题标题】:Numpy python sum over vectors of different indicesNumpy python对不同索引的向量求和
【发布时间】:2020-10-22 21:57:24
【问题描述】:

我有以下公式:

我必须编码(C 是矩阵,y 和 y_star 是向量)。根据这篇文章,我尝试了以下操作:Python numpy array sum over certain indices

> def chisq02(y, y_star, C_inv):
>     indices = len(y)
>     return np.sum(np.sum(np.matmul(y[i] - y_star[i], np.matmul(C_inv, y[j]-y_star[j])) for i in indices)for j in indices)

但它返回错误:

TypeError: 'int' object is not iterable

显然它不起作用...有谁知道这是如何工作的?

【问题讨论】:

    标签: python numpy math matrix sum


    【解决方案1】:

    如果您的矩阵/向量不是数组,请先将它们转换为数组:

    import numpy as np
    
    y = np.array(y)
    y_star = np.array(y_star)
    C_inv = np.array(C_inv)
    

    使用这个,不需要循环:

    def chisq02(y, y_star, C_inv):
        return np.sum(np.matmul(np.matmul(y-y_star, C_inv), (y-y_star)))
    

    如果您的 yy_star 是向量,那么这将起作用:

    def chisq02(y, y_star, C_inv):
        return np.matmul(np.matmul(y-y_star, C_inv), (y-y_star))
    

    【讨论】:

    • 但我需要总结两次。你确定这相当于 2 个总和吗?
    • @user11659631 始终尝试使用样品玩具进行检查。 np.sum 默认情况下对所有元素求和:checkout numpy doc numpy.org/doc/stable/reference/generated/numpy.sum.html默认值,axis=None,将对输入数组的所有元素求和。
    • @user11659631 事实上,你甚至不需要总和。删除它。
    • 因为矩阵乘法np.matmul 里面有和。当您将矩阵相乘时,您将行乘以列,然后求和。这就是使用 numpy 和矩阵乘法的重点。不鼓励使用 numpy 循环,这通常不是一个好主意。如果您有列表,请先将它们转换为 numpy。我将添加编辑以发布它。
    • 矩阵乘法具有关联性,不管你先做什么:A(BC) = (AB)C
    【解决方案2】:

    indices = len(y) 返回一个整数,所以要迭代你需要使用for i in range(indices)

    我怀疑您不需要在您的情况下使用np.matmul,因为您根据公式进行标量乘法。我想应该使用C_inv[i][j] 而不是C_inv

    【讨论】:

    • 是的,我认为你是对的!我试过了,它没有返回错误: np.sum( np.sum(y[i] - y_star[i]* C_inv[i][j]* y[j]-y_star[j] for i 在索引​​中)对于 j 在索引中)
    【解决方案3】:

    您的indices 变量只是一个整数,即y 的长度。但它必须是从 0 到 len(y) 的列表才能遍历所有索引。你可以这样做:

    indices_list = range(len(y))
    

    range() 函数产生一个列表[0, 1, ..., len(y)-1]。然后你可以在列表推导中循环这个列表。

    【讨论】:

      猜你喜欢
      • 2018-05-23
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 2019-09-01
      相关资源
      最近更新 更多