在Python中将元组元素切片和堆叠到矩阵中

时间:2018-12-26 16:02:18

标签: python numpy slice

我有一个元组列表(特征值,特征向量),我必须从中提取前60个特征向量并将它们水平堆叠成矩阵。我正在使用此代码:

matrix_60 = np.hstack((eig_pairs[:60][1]).reshape(samples,1))

代码无法正常工作(我知道元组不具有属性reshape),但是我无法弄清楚正确的语法。预期的结果是获得前60个特征向量并将它们按列堆叠(这样矩阵将有N行乘60列)。

4 个答案:

答案 0 :(得分:2)

您可以将np.stackDT$xp_ratio_y <- DT$driv_y_experience/DT$driv_y_age DT$xp_ratio_y[DT$driv_y_add_flg !=1 ] <- 0 一起使用,以逐列的方式堆叠向量:

axis=1

列表理解将从前60个元组中提取特征向量。 np.stack([vec for val, vec in eig_pairs[:60]], axis=1) 在您指定的维度上创建一个要串联的新轴。

表达式stack仍然是一个列表,因此eig_pairs[:60]只是该列表中的第二个元组,而不是每个元组中的第二个元素。这就是为什么您需要理解才能提取向量的原因。

答案 1 :(得分:0)

也许是这样吗?

np.concatenate(list(map(lambda x: x[1], eig_pairs[:60]))).reshape(-1, 60)

答案 2 :(得分:0)

如果您有一个名为tuples的特征值和向量的元组python数组,则可以得到仅包含特征向量的数组,如:

eigenvectors = [tuple[1] for tuple in tuples]

现在,您可能只需执行np.array(eigenvectors)

答案 3 :(得分:0)

正如@Tyler Chen观察到的那样,您无法使用类似Numpy的切片来切片Python元组列表(或者至少我不知道)。解决问题的方法有几种:

  1. 使用索引遍历列表
  2. 使用mapitemgetter
  3. 创建元素字典:dict()
  4. 在列表元素中使用zip

有关此SO答案中每一个的详细信息:
How to extract the n-th elements from a list of tuples in python?

这些示例均未显示如何将数组用作List / Tuple元素。因此,我使用loop方法创建了一个简单的示例(最容易让新用户理解)。 +-+-+-+注释上方的代码创建的数据类似于您的数据(如果我理解问题说明)。注释下面的代码显示了我将如何做。我在索引上循环,因为在添加到数组时将其用作行号。您还可以循环使用列表元素,并为此添加一个行计数器(请参阅替代方法)。
此示例在每个特征向量中有10行和20个值。我将概括一下N行和M向量。
注意:Numpy数组大小是预先分配的。因此,通常,您需要扫描元组以确定在循环之前分配数组的行数和列数。

import numpy as np
# First, build some simple Eigenvalue and Eigenvector data
# 10 Eigenvalues in eig_vals and Eigenvectors as 20 values in 10 rows (shape [10,20])
eig_vals = np.logspace(0.1,3., num=10)
eig_vec = np.zeros([10,20])
for i in range(len(eig_vals)) :
  eig_vec_r = np.random.random_sample(20)
  eig_vec[i,:]=eig_vec_r
# Create List of tuples for each eig_vals, eig_vec pair: 
eigen_pairs = [(eig_vals[i], eig_vec[i,:]) for i in range(len(eig_vals)) ]
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

# create new nd.array to hold extrated Eigenvector data (shape [10,20])
saved_eig_vec = np.zeros([10,20])

# loop thru List of tuples to extract Eigenvector array and write to saved_eig_vec
# Each Eigenvector will be in 1 row
for i in range(len(eigen_pairs)) :
  saved_eig_vec[i,:] = eigen_pairs[i][1]

#Verify correctness by comparing the following values:
#  1) eig_vec[9,:] initial array created with random_sample function
#  2) eigen_pairs[9][1] -  array saved in list of tuples
#  3) saved eig_vec[9,:] array extrated and saved from list of tuples

print (eig_vec[9,:])
print (eigen_pairs[9][1])
print (saved_eig_vec[9,:])

# Alternate method, looping on list elements with row counter (reset saved_eig_vec array)
saved_eig_vec = np.zeros([10,20])
row = 0
for i in eigen_pairs :
  saved_eig_vec[row,:] = i[1]
  row += 1

print (saved_eig_vec[9,:])