gpt4 book ai didi

python - 递归函数调用不向列表添加值

转载 作者:行者123 更新时间:2023-12-04 08:54:06 25 4
gpt4 key购买 nike

我正在使用列表而不使用库来创建张量。类(class)张量 有一个方法叫做, shape_data ,它通过接收维度和子列表来创建张量。

  def shape_data(self, dim, sub):
if dim >= len(self.shape):
return
elif (len(sub) == 0) & (dim < (len(self.shape) - 1)):
for i in range(self.shape[dim]):
sub.append([])
self.shape_data(dim + 1, sub[i])
elif len(sub) == 0:
if len(self.data) > self.shape[dim]:
sub = self.data[0:self.shape[dim]]
self.data = self.data[self.shape[dim]:]
elif len(self.data) <= self.shape[dim]:
sub = self.data[0:]
self.data = []
while len(sub) != self.shape[dim]:
sub.append(0)

data0 = [0, 1, 2, 3, 4, 5, 0.1, 0.2, -3, -2, -1, 3, 2, 1]
shape0 = [5, 2]
tensor0 = Tensor(data0, shape0)
这是我得到的输出 [[], [], [], [], []]对比我想要的 [[0, 1], [2, 3], [4, 5], [0.1, 0.2], [-3, -2]]我的问题是,我在这里错过了什么数字没有被成功复制?

最佳答案

我怀疑,问题出在以下几行:

sub = self.data[0:self.shape[dim]]
如果你给变量 sub 赋值,它就会指向新的值。它在该分配之前指向的值(您的原始列表)将保持不变。
相反,如果您为该列表的元素分配某些内容,这将更改原始列表:
sub[:] = self.data[0:self.shape[dim]]
同样影响这一行:
sub = self.data[0:]
这是更正的代码:
class Tensor():

def __init__(self, data, shape):
self.data = data
self.shape = shape
self.tensor = []
self.shape_data(0, self.tensor, 0)
print(self.tensor)

def shape_data(self, dim, sub, pos):
if dim >= len(self.shape):
return
elif (len(sub) == 0) & (dim < (len(self.shape) - 1)):
for i in range(self.shape[dim]):
sub.append([])
self.shape_data(dim + 1, sub[i], i)
elif len(sub) == 0:
if len(self.data) > self.shape[dim]:
sub[:] = self.data[0:self.shape[dim]]
self.data = self.data[self.shape[dim]:]
elif len(self.data) <= self.shape[dim]:
sub[:] = self.data[0:]
self.data = []
while len(sub) != self.shape[dim]:
sub.append(0)

关于python - 递归函数调用不向列表添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63931502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com