类型错误:append() 缺少 1 个必需的位置参数:“值”

Posted

技术标签:

【中文标题】类型错误:append() 缺少 1 个必需的位置参数:“值”【英文标题】:TypeError: append() missing 1 required positional argument: 'values' 【发布时间】:2017-07-23 21:10:46 【问题描述】:

我有大小为 360x190 的变量“x_data”,我正在尝试选择特定的数据行。

 x_data_train = []
 x_data_train = np.append([x_data_train,
                           x_data[0:20,:],
                           x_data[46:65,:],
                           x_data[91:110,:],
                           x_data[136:155,:],
                           x_data[181:200,:],
                           x_data[226:245,:],
                           x_data[271:290,:],
                           x_data[316:335,:]],axis = 0)

我收到以下错误: 类型错误:append() 缺少 1 个必需的位置参数:'values'

我哪里做错了?

如果我正在使用

x_data_train = []
x_data_train.append(x_data[0:20,:])
x_data_train.append(x_data[46:65,:])
x_data_train.append(x_data[91:110,:])
x_data_train.append(x_data[136:155,:])
x_data_train.append(x_data[181:200,:])
x_data_train.append(x_data[226:245,:])
x_data_train.append(x_data[271:290,:])
x_data_train.append(x_data[316:335,:])

输出的大小是 8 行而不是 160 行。

更新:

在 matlab 中,我将加载文本文件,x_data 将是具有 360 行和 190 列的变量。 如果我想选择 1 to 20 , 46 to 65, ... rows of data ,我只是给 x_data_train = xdata([1:20,46:65,91:110,136:155,181:200,226:245,271:290,316:335], :); 结果 x_data_train 将是我想要的数组。

如何在 python 中做到这一点,因为它会产生 8 个数组子集的数组,每个数组 20*192,但我希望它是一个数组 160*192

【问题讨论】:

来自评论:Raady,如果你和 RDK 是同一个人,加入你的 SO 帐户是有意义的,这样你就可以编辑自己的帖子而不会被卡住。 RDK 帐户是我的,我不知道我已从该帐户编辑,我会更新。我不知道我们可以合并帐户。 这不是一个全自动的过程,但它仍然可以完成。见***.com/help/merging-accounts 【参考方案1】:

简短版:在 python 中做你想做的最惯用和最快的方法是这样的(假设 x_data 是一个 numpy 数组):

x_data_train = np.vstack([x_data[0:20,:],
                          x_data[46:65,:],
                          x_data[91:110,:],
                          x_data[136:155,:],
                          x_data[181:200,:],
                          x_data[226:245,:],
                          x_data[271:290,:],
                          x_data[316:335,:]])

这可以通过以下方式缩短(但会稍微变慢):

xdata[np.r_[0:20,46:65,91:110,136:155,181:200,226:245,271:290,316:335], :]

对于您有很多索引的情况,我认为这有助于提高可读性,但在索引较少的情况下,我会使用第一种方法。

长版:

这里有几个不同的问题。

首先,在 python 中,[] 创建一个列表,而不是像 MATLAB 中的数组。列表更像是一维元胞数组。它们可以保存任何数据类型,包括其他列表,但它们不能有多个维度。 Python 中的 MATLAB 矩阵等价物是 numpy 数组,它们是使用 np.array 创建的。

其次,Python 中的[x, y] 总是创建一个列表,其中第一个元素是x,第二个元素是y。在 MATLAB 中,[x, y] 可以根据xy 的内容来做几种完全不同的事情之一。在您的情况下,您想要连接。在 Python 中,您需要显式连接。对于两个列表,有几种方法可以做到这一点。最简单的是使用x += y,它通过将y 的内容放在末尾来就地修改x。您可以通过执行x += y + z + w 之类的操作来组合多个列表。如果您想保持x 不变,您可以使用z = x + y 之类的东西分配给一个新变量。最后,您可以使用x.extend(y),它大致相当于x += y,但适用于列表以外的一些数据类型。

对于 numpy 数组,您需要使用稍微不同的方法。虽然 Python 列表可以就地修改,但严格来说,MATLAB 矩阵和 numpy 数组都不能。 MATLAB 假装允许这样做,但它实际上是在幕后创建一个新矩阵(这就是为什么如果您尝试在循环中调整矩阵大小时会收到警告)。 Numpy 要求您更明确地创建新数组。最简单的方法是使用np.hstack,它水平连接两个数组(或np.vstacknp.dstack 分别用于垂直和深度连接)。所以你可以做z = np.hstack([v, w, x, y])。 numpy 中有一个append 方法和函数,但它在实践中几乎从不工作,所以不要使用它(它需要仔细的内存管理,这比它的价值更麻烦)。

第三,append 所做的是在目标列表中创建一个新元素,并将任何变量append 放入该元素中。因此,如果您执行x.append([1,2,3]),它会在包含列表[1,2,3] 的列表x 的末尾添加一个新元素。它更像x = [x, 1,2,3,其中x 是一个元胞数组。

第四,Python 大量使用“方法”,它们基本上是附加到数据的函数(它比实践中的方法要复杂一些,但这些复杂性在这里并不真正相关)。最新版本的 MATLAB 也添加了它们,但它们并没有像在 Python 中那样真正集成到 MATLAB 数据类型中。因此,在 MATLAB 中,您通常会使用 sum(x),而对于 numpy 数组,您将使用 x.sum()。在这种情况下,假设您正在执行附加操作(您不是),您不会使用np.append(x, y),而是使用x.append(y)

最后,在 MATLAB 中,x:y 创建了一个从xy 的值矩阵。然而,在 Python 中,它创建了一个“切片”,它实际上并不包含所有值,因此可以通过列表和 numpy 数组更快地处理。但是,您不能像在示例中那样真正使用多个切片(因为 numpy 中的切片不会像在 MATLAB 中那样制作副本,而使用多个索引确实会制作副本,这也没有意义)。您可以使用np.r_ 获得与 MATLAB 中的内容相近的内容,它会基于索引和切片创建一个 numpy 数组。因此,要在 numpy 中重现您的示例,其中 xdata 是一个 numpy 数组,您可以执行 xdata[np.r_[1:20,46:65,91:110,136:155,181:200,226:245,271:290,316:335], :]

【讨论】:

【参考方案2】:

可能需要更多关于 x_data 和 np 的信息来解决这个问题,但是......

首先:您正在创建同一列表的 2 个副本:np 和 x_data_train 第二:您对 x_data 的索引很奇怪 第三:当它只接受 2 个时,您将 3 个对象传递给 append()。

我很确定重新访问您在 x_data 上的索引将是您解决当前错误的地方,但它会导致另一个与传递 2 个值相关的错误。

我也确定你想要

    x_data_train.append(object) 

不是

    x_data_train = np.append(object)

你可能真的想要

    x_data_train.extend([objects])

更多关于追加与扩展的信息:append vs. extend

【讨论】:

extend 正在制作 8 个子数组,但我需要一个合并的子数组。我做了一个更新,希望你能更好地理解这个问题。

以上是关于类型错误:append() 缺少 1 个必需的位置参数:“值”的主要内容,如果未能解决你的问题,请参考以下文章

类型错误:parse() 缺少 1 个必需的位置参数:'stream'

类型错误:预测()缺少 1 个必需的位置参数:'params'

类型错误:new() 缺少 1 个必需的位置参数:'y'

类型错误:攻击()缺少 1 个必需的位置参数:“自我”

类型错误:预测()缺少 1 个必需的位置参数:'y_train'

类型错误:<lambda>() 缺少 1 个必需的位置参数:'w'