【问题标题】:Python: general sum over numpy rowsPython:numpy行的一般总和
【发布时间】:2021-12-03 16:09:35
【问题描述】:

我想对一个矩阵的所有行求和,因此,如果我有一个n x 2 矩阵,结果应该是一个所有行求和的1 x 2 向量。我可以用np.sum( arg, axis=1 ) 做类似的事情,但如果我提供一个向量作为参数,我会得到一个错误。是否有任何更通用的 sum 函数在提供向量时不会引发错误?注意:这在 MATLAB 中从来不是问题。

背景:我写了一个函数,它计算一些东西并对矩阵的所有行求和。根据输入的数量,矩阵有不同的行数,行数为>= 1

【问题讨论】:

  • 我认为最好提供原始矩阵。
  • 您应该使用axis=0 对行求和,而不是axis=1。
  • @Steradiant,我认为您误解了您链接的表格中箭头的含义。箭头表示您正在求和的其他内容,因此对轴 = 0 的行求和。它们不表示结果的形状。
  • 您的问题是对于向量,axis=0 不对应于“行”,因为一维数组没有任何行。但是你只需要检查 your_array.shape 就像 scandav 在他的回答中所做的那样。

标签: python numpy sum


【解决方案1】:

根据 numpy.sum documentation,你不能为向量指定 axis=1,因为你会得到一个 numpy AxisErroraxis 1 is out of bounds for array of dimension 1

例如,一种可能的解决方法是编写一个专用函数,在执行求和之前检查大小。请在下面找到一个可能的实现:

import numpy as np

M = np.array([[1, 4],
             [2, 3]])

v = np.array([1, 4])

def sum_over_columns(input_arr):
    if len(input_arr.shape) > 1:
        return input_arr.sum(axis=1)
    return input_arr.sum()

print(sum_over_columns(M))
print(sum_over_columns(v))

以更 Pythonic 的方式(不一定更具可读性):

def oneliner_sum(input_arr):
    return input_arr.sum(axis=(1 if len(input_arr.shape) > 1 else None))

【讨论】:

    【解决方案2】:

    你可以的

    np.sum(np.atleast_2d(x), axis=1)
    

    如有必要,这将首先将向量转换为单维二维矩阵。

    【讨论】:

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