Как отсортировать кортеж numpy без ошибки о том, что только массивы длины 1 могут быть преобразованы в скаляры python

Я использую numpy для генерации собственных векторов и собственных значений. Проблема возникает при формировании их кортежей и попытке отсортировать пары. Я получаю сообщение об ошибке: TypeError: только массивы длины 1 могут быть преобразованы в скаляры python.

Вот код:

import numpy as np
import pandas as pd


df=\
pd.read_csv(r'C:\Users\james\Desktop\Documents\Downloads\bpAFTPosWords.csv'
#df.head()

#Drop columns whose sum is less than 30
df.sum(axis = 0, skipna = True)
df_to_save = df.loc[:, (df.sum(axis=0, skipna=True) >= 30)]
#df_to_save.head()

#Standardize the data
from sklearn.preprocessing import StandardScaler
X_std = StandardScaler().fit_transform(df_to_save)

#Compute correlations
cor_mat1 = np.corrcoef(X_std.T)
#Produce PCA eigenvector and eigenvalues
eig_vals, eig_vecs = np.linalg.eig(cor_mat1)

#print('Eigenvectors \n%s' %eig_vecs)
#print('\nEigenvalues \n%s' %eig_vals)

# Make a list of (eigenvalue, eigenvector) tuples
eig_pairs = np.array(list(zip(eig_vals,eig_vecs)))
eig_pairs = eig_pairs[
        eig_pairs[:,0].argsort()[::-1]]

# Visually confirm that the list is correctly sorted by decreasing
print('Eigenvalues in descending order:')
for i in eig_pairs:
print(i[0])

#Here is the context for the error:
TypeError Traceback (most recent call last)
<ipython-input-7-2342d13b7710> in <module>
21
22 # Make a list of (eigenvalue, eigenvector) tuples
---> 23 eig_pairs = np.array(list(zip(eig_vals,eig_vecs)))
24
25 eig_pairs = eig_pairs[
TypeError: only length-1 arrays can be converted to Python scalars

Если мои данные помогут вам решить проблему, вот файл .csv:

https://docs.google.com/spreadsheets/d/1GRPbfHHB1mbO5Eo26B6crTl7FN1cNnLoU-oRQCEu7v8/edit?usp=sharing

Второй вопрос, который у меня есть, заключается в том, как выводить в файл загрузки каждой строки для каждого собственного вектора. Пока не удалось понять это из поиска в Google и документации.

Спасибо за вашу помощь!


person James Danowski    schedule 19.05.2019    source источник


Ответы (1)


Я не смог воспроизвести вашу ошибку, но вот решение, основанное на сортировке numpy.

import numpy as np

X_std = np.random.random((8,8))

cor_mat1 = np.corrcoef(X_std.T)
eig_vals, eig_vecs = np.linalg.eig(cor_mat1)

print('Eigenvectors \n%s' %eig_vecs)
print('\nEigenvalues \n%s' %eig_vals)

# Make a list of (eigenvalue, eigenvector) tuples
eig_pairs = np.array(list(zip(eig_vals,eig_vecs)))

eig_pairs = eig_pairs[
        eig_pairs[:,0].argsort()[::-1]
                 ]

# Visually confirm that the list is correctly sorted by decreasing 
print('Eigenvalues in descending order:')
for i in eig_pairs:
    print(i[0])

Здесь вы можете прочитать о zip < em>функцию и здесь о argsort

Надеюсь, это поможет.

person Arkady. A    schedule 19.05.2019
comment
Спасибо за вашу помощь. Ваш код со случайными данными работает, но когда я пытаюсь использовать свои данные, я получаю сообщение об ошибке. Описание проблемы выше отредактировано, чтобы включить ссылку на мои данные и мой код. Надеюсь, вы сможете отладить. Благодарю вас! - person James Danowski; 19.05.2019