Как заметил @Tyler Chen, вы не можете нарезать список кортежей Python с помощью Numpy-подобного среза (или, по крайней мере, я не знаю способа).Есть несколько способов решения проблемы:
- переберите список с индексом
- , используйте
map
и itemgetter
- создайте словарьэлементы:
dict()
- использование
zip
в элементах списка
Подробно о каждом в этом ответе SO:
Как извлечь n-й элементиз списка кортежей в python?
Ни один из примеров не показывает, как это работает с массивом как элементом List / Tuple.Итак, я создал простой пример с использованием метода цикла (проще всего понять новому пользователю).Код над комментарием +-+-+-+
создает данные, аналогичные вашим (если я понимаю формулировку проблемы).Код под комментарием показывает, как я это сделаю.Я зациклился на индексе, потому что я использую его в качестве номера строки при добавлении в массив.Вы также можете зациклить элементы списка и добавить для этой цели счетчик строк (см. Альтернативный метод).
В этом примере 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,:])