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

Raa*_*ady 4 append python-3.x

我有大小为 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)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误: TypeError:append() 缺少 1 个必需的位置参数:“值”

我哪里做错了 ?

如果我正在使用

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,:])
Run Code Online (Sandbox Code Playgroud)

输出的大小是 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

The*_*Cat 6

简短版本:在 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,:]])
Run Code Online (Sandbox Code Playgroud)

这可以通过执行以下操作来缩短(但会稍微慢一些):

xdata[np.r_[0:20,46:65,91:110,136:155,181:200,226:245,271:290,316:335], :]
Run Code Online (Sandbox Code Playgroud)

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

长版:

这里有几个不同的问题。

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

其次,[x, y]在Python中总是创建一个列表,其中第一个元素是x,第二个元素是y。在 MATLAB 中,[x, y]可以执行几种完全不同的操作之一,具体取决于x和 的y内容。在你的情况下,你想要连接。在 Python 中,您需要显式连接。对于两个列表,有多种方法可以做到这一点。最简单的是使用x += y,它通过将 的内容放在末尾来进行x就地修改。y您可以通过执行类似的操作来组合多个列表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])的列表末尾添加一个新元素。它更像是,哪里是一个元胞数组。x[1,2,3]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的矩阵。然而,在 Python 中,它创建一个“切片”,它实际上并不包含所有值,因此可以通过列表和 numpy 数组更快地处理。但是,您无法像在示例中那样真正使用多个切片(也没有意义,因为 numpy 中的切片不会像在 MATLAB 中那样进行复制,而使用多个索引确实会进行复制)。您可以使用 获得与 MATLAB 中类似的效果,它根据索引和切片创建一个 numpy 数组。因此,要在 numpy 中重现您的示例,其中numpy 数组在哪里,您可以执行以下操作xynp.r_xdataxdata[np.r_[1:20,46:65,91:110,136:155,181:200,226:245,271:290,316:335], :]