鱼C论坛

 找回密码
 立即注册
查看: 2245|回复: 3

[已解决]sum()函数

[复制链接]
发表于 2023-4-15 11:28:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题1.
对于list
X = [[1,2,3],[4,5,6]]
如何使用sum使得返回[5,7,9]呢?

问题2.
X.sum(dim=0)是不是要求X为tensor?我如何把list转换为tensor呢?

问题3.
有一个返回generator的函数f(x,k),然后可以求和:
sum(f(x,k) for x,k in zip(X,K))
为什么我无法让Y= (f(x,k) for x,k in zip(X,K))  然后sum(Y)呢?
此外,如何将generator转换成tensor呢?
最佳答案
2023-4-15 11:33:56
问题1.
对于list X = [[1, 2, 3], [4, 5, 6]],你可以使用列表推导式与zip函数将两个子列表相加,如下所示:
X = [[1, 2, 3], [4, 5, 6]]
result = [sum(x) for x in zip(*X)]
print(result)  # 输出:[5, 7, 9]

问题2.
是的,X.sum(dim=0)需要X为一个tensor。你可以使用PyTorch将list转换为tensor,如下所示:
import torch

X = [[1, 2, 3], [4, 5, 6]]
X_tensor = torch.tensor(X)  # 将list转换为tensor
result = X_tensor.sum(dim=0)  # 沿着第0个维度求和
print(result)  # 输出:tensor([5, 7, 9])

问题3.
首先,回答你关于为什么不能使用以下代码的问题:
Y = (f(x, k) for x, k in zip(X, K))
sum(Y)

这是因为当你将生成器赋值给Y时,它仅仅是一个生成器对象,而不是一个实际的序列。当你尝试对其求和时,你需要将生成器转换为一个可迭代的对象。你可以将生成器转换为列表,然后对其求和,如下所示:
Y = (f(x, k) for x, k in zip(X, K))
result = sum(list(Y))
此外,要将生成器转换为tensor,你可以使用torch.tensor()函数将生成器转换为一个列表,然后将该列表转换为tensor:
import torch

Y = (f(x, k) for x, k in zip(X, K))
Y_tensor = torch.tensor(list(Y))  # 将生成器转换为tensor
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-15 11:33:56 | 显示全部楼层    本楼为最佳答案   
问题1.
对于list X = [[1, 2, 3], [4, 5, 6]],你可以使用列表推导式与zip函数将两个子列表相加,如下所示:
X = [[1, 2, 3], [4, 5, 6]]
result = [sum(x) for x in zip(*X)]
print(result)  # 输出:[5, 7, 9]

问题2.
是的,X.sum(dim=0)需要X为一个tensor。你可以使用PyTorch将list转换为tensor,如下所示:
import torch

X = [[1, 2, 3], [4, 5, 6]]
X_tensor = torch.tensor(X)  # 将list转换为tensor
result = X_tensor.sum(dim=0)  # 沿着第0个维度求和
print(result)  # 输出:tensor([5, 7, 9])

问题3.
首先,回答你关于为什么不能使用以下代码的问题:
Y = (f(x, k) for x, k in zip(X, K))
sum(Y)

这是因为当你将生成器赋值给Y时,它仅仅是一个生成器对象,而不是一个实际的序列。当你尝试对其求和时,你需要将生成器转换为一个可迭代的对象。你可以将生成器转换为列表,然后对其求和,如下所示:
Y = (f(x, k) for x, k in zip(X, K))
result = sum(list(Y))
此外,要将生成器转换为tensor,你可以使用torch.tensor()函数将生成器转换为一个列表,然后将该列表转换为tensor:
import torch

Y = (f(x, k) for x, k in zip(X, K))
Y_tensor = torch.tensor(list(Y))  # 将生成器转换为tensor
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-15 14:12:57 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-4-15 14:15 编辑
isdkz 发表于 2023-4-15 11:33
问题1.
对于list X = [[1, 2, 3], [4, 5, 6]],你可以使用列表推导式与zip函数将两个子列表相加,如下所示 ...


没看懂

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-15 16:35:18 | 显示全部楼层
问题1:
可以使用列表解析式和内置函数sum()实现:
X = [[1, 2, 3], [4, 5, 6]]
result = [sum(x) for x in zip(*X)]
print(result)
输出:[5, 7, 9]

列表解析式中,zip(*X)将X按列解压成元组的列表,然后每个元组的元素相加求和即可。

问题2:
是的,sum(dim=0)是PyTorch中Tensor对象的方法。将list转换为Tensor对象,可以使用torch.tensor()函数:
import torch

X = [[1, 2, 3], [4, 5, 6]]
X_tensor = torch.tensor(X)
result = X_tensor.sum(dim=0)
print(result)
输出:tensor([5, 7, 9])

问题3:
生成器对象只能遍历一次,因此当你在列表解析式中使用sum()函数时,生成器对象已经被耗尽了。如果要多次遍历生成器对象,可以使用列表解析式或将生成器对象转换为列表,然后再使用sum()函数。
# 使用列表解析式
Y = (f(x, k) for x, k in zip(X, K))
result = sum([y for y in Y])
print(result)

# 将生成器对象转换为列表
Y = list(f(x, k) for x, k in zip(X, K))
result = sum(Y)
print(result)
要将生成器对象转换为Tensor对象,可以先将其转换为列表,然后使用torch.tensor()函数将列表转换为Tensor对象:
Y = (f(x, k) for x, k in zip(X, K))
Y_list = list(Y)
Y_tensor = torch.tensor(Y_list)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 22:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表