类型错误: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]
可以根据x
和y
的内容来做几种完全不同的事情之一。在您的情况下,您想要连接。在 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.vstack
或np.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
创建了一个从x
到y
的值矩阵。然而,在 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'