【numpy求和】numpy.sum()求和

本文详细介绍了Python中NumPy库的数组求和方法,包括numpy.sum()函数和数组实例方法.sum()的使用,以及如何对特定轴进行求和运算。通过实例展示了不同轴向求和的具体操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

numpy.sum(a, axis=None, dtype=None, out=None, keepdims=, initial=)[source])用于计算array元素的和.

python中常用的numpy进行数学计算,其中array的求和运算分为两种,一种是调用numpy.array自身的sum()方法,另一种是利用numpy的内建函数numpy.sum()使用。(tips:python从0开始计数axis=0对应第一个维度)

#example
import numpy as np
x = np.random.rand(2,3,4)    #生成三维随array
print("This is a 2*3rows 4cols array\n",x)
'''
>>> This is a 2*3rows 4cols array
[[[ 0.88264952  0.12446208  0.82166137  0.31747846]
  [ 0.51436626  0.03051283  0.46987831  0.64086531]
  [ 0.14819094  0.6395191   0.21753309  0.61340538]]

 [[ 0.0878878   0.5317064   0.65523138  0.704961  ]
  [ 0.51081521  0.88710145  0.92958269  0.89587262]
  [ 0.60233393  0.26146419  0.26584161  0.0823285 ]]]
'''
print('instance method:',x.sum())
print('numpy function:',np.sum(x))
'''
>>> 'instance method:', 11.835649415181807
>>> 'numpy function:', 11.835649415181807
'''

#对特定的轴求和
print('First axis sum',x.sum(axis=0))
'''
>>> 'First axis sum',   #第一维是轴0,对前后两页array加和得到3*4的array输出
array([[ 0.97053732,  0.65616848,  1.47689275,  1.02243946],
       [ 1.02518147,  0.91761428,  1.399461  ,  1.53673793],
       [ 0.75052486,  0.90098329,  0.4833747 ,  0.69573388]])
'''
print('Second axis sum',x.sum(axis=1))
'''
>>> 'Second axis sum',   #第二维是轴1,将每列的三行进行sum(对行求sum),得到2*4的输出
array([[ 1.54520672,  0.79449401,  1.50907277,  1.57174914],
       [ 1.20103694,  1.68027204,  1.85065568,  1.68316212]])
'''
print('Third axis sum',x.sum(axis=2))
'''
>>> 'Third axis sum',    #第三维是轴2,有4个数,将每行四个数加和(对列求sum),得到2*3输出
array([[ 2.14625142,  1.65562271,  1.6186485 ],
       [ 1.97978658,  3.22337197,  1.21196823]])
'''


#对多个轴求和
print('axis1,2 sum:',x.sum(axis=(1,2)))
'''
>>> 'axis1,2 sum:      #对第二维(axis=1)和第三维(axis=2)求和,归在第一维(axis=0)上
array([ 5.42052263,  6.41512678]) 
'''

在这里插入图片描述pic from pexels


ref:
https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.sum.html
https://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html
https://blog.youkuaiyun.com/Leekingsen/article/details/76242244
https://blog.youkuaiyun.com/addmana/article/details/78472608

<think>嗯,用户问的是numpy.sum输入一维数组求和报错的问题。首先,我得回忆一下numpy.sum的基本用法,以及常见的错误类型。 用户提到的是输入一维数组,但报错了。正常情况下,numpy.sum处理一维数组应该没有问题,比如np.sum([1,2,3])会返回6。那为什么会报错呢?可能的原因有几个: 首先,检查数据类型。可能数组中的元素不是数值类型,比如有字符串或者其他非数字类型。例如,如果数组是[1, 'a', 3],用np.sum的话就会出错,因为无法将字符串和整数相加。这时候需要用户检查数组元素是否都是数值类型。 其次,用户可能在调用np.sum时传入了不正确的参数。例如,axis参数设置不当。一维数组的axis只能是0或者-1,如果用户误设为其他值,比如axis=1,就会报错。这时候需要提醒用户检查axis参数是否正确。 另外,数组的维度可能被误解。有时候用户以为是一维数组,但实际可能是二维的,比如形状是(1, N)或者(N, 1),这时候如果设置axis参数为1,同样会报错。这时候需要用shape属性确认数组的维度。 还有可能用户使用的numpy版本有问题,但这种情况比较少见。或者是安装问题,但通常会直接提示导入错误,而不是在sum函数上报错。 然后,我需要考虑用户可能的操作步骤。比如用户是如何创建数组的,是否使用了正确的numpy函数生成数组。例如,如果用户用普通的Python列表,里面夹杂了非数字元素,那转换成numpy数组时会变成dtype=object,这时候进行sum操作可能会导致问题。 另外,可能用户在使用np.sum的时候,除了数组还传入了其他不兼容的参数,比如dtype参数设置错误,或者keepdims参数的问题。需要提醒用户检查函数参数。 可能的解决方案包括:确保数组元素都是数值类型,检查axis参数是否正确,确认数组维度,处理可能的NaN值,以及检查numpy的安装是否正常。 最后,需要给出具体的示例代码和错误复现,帮助用户理解问题所在。比如,演示正确的一维数组求和,以及常见错误情况下的报错信息,让用户对比自己的情况。</think>--- ### **问题分析** 当使用`numpy.sum`对一维数组求和报错时,常见原因如下: | **错误类型** | **典型场景** | **报错信息示例** | |---------------------------|---------------------------------|-------------------------------------| | **非数值型元素** | 数组中混入字符串、对象等非数值 | `TypeError: numpy.sum() got an unexpected keyword argument` | | **维度理解错误** | 误将一维数组当作二维操作 | `numpy.AxisError: axis 1 is out of bounds` | | **参数传递错误** | 错误使用`axis`或`dtype`参数 | `TypeError: sum() got an unexpected keyword argument` | | **数组定义问题** | 未正确定义NumPy数组 | `AttributeError: 'list' object has no attribute 'sum'` | --- ### **解决方案** 按步骤排查并修复错误: --- #### **1. 检查数组元素类型** **问题**:数组中存在非数值型元素(如字符串、对象) **修复方法**: ```python import numpy as np # 错误示例 arr = np.array([1, "2", 3]) # dtype=object try: print(np.sum(arr)) except TypeError as e: print(f"错误:{e}") # 报错:numpy.core._exceptions._UFuncNoLoopError # 正确操作 arr = np.array([1, 2, 3], dtype=np.float64) print(np.sum(arr)) # 6.0 ``` --- #### **2. 验证数组维度** **问题**:误判数组维度导致`axis`参数错误 **排查方法**: ```python arr = np.array([1, 2, 3]) print(arr.ndim) # 输出维度:1 print(arr.shape) # 输出形状:(3,) # 错误使用axis=1(仅适用于二维及以上) try: print(np.sum(arr, axis=1)) except np.AxisError as e: print(f"错误:{e}") # AxisError: axis 1 is out of bounds # 正确用法 print(np.sum(arr, axis=0)) # 6 ``` --- #### **3. 检查参数合法性** **问题**:误传无效参数(如拼写错误) **参数对照表**: | 合法参数 | 非法参数示例 | |------------------|-------------------| | `axis=0` | `axix=0` | | `dtype=np.int32` | `datatype=int` | | `keepdims=True` | `keep_dim=True` | **修复示例**: ```python # 错误示例(拼写错误) try: np.sum(arr, axix=0) except TypeError as e: print(f"错误:{e}") # sum() got an unexpected keyword argument 'axix' # 正确用法 print(np.sum(arr, axis=0, dtype=np.float32)) # 6.0 ``` --- #### **4. 确保操作对象为NumPy数组** **问题**:对Python原生列表直接使用`.sum()` **对比操作**: ```python # 错误操作 python_list = [1, 2, 3] try: print(python_list.sum()) except AttributeError as e: print(f"错误:{e}") # 'list' object has no attribute 'sum' # 正确操作 numpy_arr = np.array(python_list) print(numpy_arr.sum()) # 6 ``` --- ### **完整错误排查流程** ```python def safe_numpy_sum(arr): # 步骤1:转换为NumPy数组 if not isinstance(arr, np.ndarray): arr = np.array(arr) # 步骤2:检查元素类型 if arr.dtype == object: raise ValueError("数组包含非数值元素") # 步骤3:验证维度 if arr.ndim != 1: raise ValueError("仅支持一维数组") # 步骤4:执行求和 return np.sum(arr) # 测试案例 print(safe_numpy_sum([1, 2, 3])) # 6 ``` --- ### **常见错误复现与修复** | **错误场景** | **错误代码** | **修复代码** | |---------------------------|---------------------------------|---------------------------------| | 混合类型数组 | `np.sum([1, "2", 3])` | `np.sum([1, 2, 3])` | | 错误使用axis参数 | `np.sum([1,2,3], axis=1)` | `np.sum([[1,2],[3,4]], axis=1)`| | 对列表调用.sum() | `[1,2,3].sum()` | `np.array([1,2,3]).sum()` | --- ### **高级技巧** 1. **处理NaN值**: ```python arr = np.array([1, np.nan, 3]) print(np.nansum(arr)) # 4.0(自动跳过NaN) ``` 2. **指定数据类型避免溢出**: ```python big_arr = np.array([1000000]*1000, dtype=np.int32) print(np.sum(big_arr, dtype=np.int64)) # 1000000000(避免int32溢出) ``` --- ### **总结** 遇到`numpy.sum`报错时,按以下顺序排查: 1. 确认输入是NumPy数组(非Python列表) 2. 检查元素类型(必须为数值型) 3. 验证`axis`参数与数组维度匹配 4. 检查参数拼写和合法性 若仍无法解决,可使用`print(arr.dtype)`和`print(arr.shape)`输出数组详细信息辅助调试。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值