我有一个元组列表(特征值,特征向量),我必须从中提取前60个特征向量并将它们水平堆叠成矩阵。我正在使用此代码:
matrix_60 = np.hstack((eig_pairs[:60][1]).reshape(samples,1))
代码无法正常工作(我知道元组不具有属性reshape
),但是我无法弄清楚正确的语法。预期的结果是获得前60个特征向量并将它们按列堆叠(这样矩阵将有N行乘60列)。
答案 0 :(得分:2)
您可以将np.stack
与DT$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元组列表(或者至少我不知道)。解决问题的方法有几种:
map
和itemgetter
dict()
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,:])