TypeError:append()缺少1个必需的位置参数:'values'

时间:2017-03-03 16:45:15

标签: python-3.x append

我的变量'x_data'大小为360x190,我试图选择特定的数据行。

 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)

我收到以下错误: TypeError: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到20,46到65 ......数据行,我只想给出 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

2 个答案:

答案 0 :(得分:2)

简短版本:在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中那样的数组。列表更像是1D单元阵列。它们可以包含任何数据类型,包括其他列表,但它们不能具有多个维度。 Python中MATLAB矩阵的等价物是numpy数组,使用np.array创建。

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

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

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

第四,Python大量使用"方法",它们基本上是附加到数据上的函数(它比实际中的更复杂,但这些复杂性在这里并不相关) 。最新版本的MATLAB也添加了它们,但它们并没有真正集成到MATLAB数据类型中,就像它们在Python中一样。那么在MATLAB中通常使用np.append(x, y),对于numpy数组,您将使用x.append(y)。在这种情况下,假设你正在做追加(你不是),你就不会使用x:y,你会使用x

最后,在MATLAB y中创建一个从np.r_xdata的值矩阵。但是,在Python中,它会创建一个" slice",它实际上并不包含所有值,因此可以通过列表和numpy数组更快地处理。但是,你可以像在你的例子中一样使用多个切片(也没有意义,因为numpy中的切片不像在MATLAB中那样复制,而使用多个索引确实复制)。您可以使用xdata[np.r_[1:20,46:65,91:110,136:155,181:200,226:245,271:290,316:335], :]获得与MATLAB中的内容接近的内容,它会根据索引和切片创建一个numpy数组。因此,要在numpy中重现您的示例,其中source 'https://github.com/CocoaPods/Specs.git' platform :ios, '7.0' target 'NativeAdvancedExample' do pod 'Firebase/Core' pod 'Firebase/AdMob' end 是一个numpy数组,您可以执行{{1}}

答案 1 :(得分:1)

可能需要更多关于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])

有关追加vs扩展的详情:append vs. extend