我的变量'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
答案 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]
中,x
和y
取决于x += y
和x
,可以做几件完全不同的事情。在您的情况下,您想要连接。在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