Стандартизация данных неправильной формы (TypeError: только массивы размера 1 могут быть преобразованы в Python скаляры) - PullRequest
0 голосов
/ 24 апреля 2020

Итак, у меня есть массив XsN формы (590,), и я пытаюсь стандартизировать данные.

Это пример одного из 590 элементов в моем массиве:

print(XsN[:1])

[array([[ 0.        ,  0.27229556, -1.8033657 , ...,  0.        ,
     0.        ,  0.        ],
   [ 0.        ,  0.20665401, -1.9340569 , ...,  0.        ,
     0.        ,  0.        ],
   [ 4.        ,  0.        ,  0.04352444, ...,  0.        ,
     0.        ,  0.        ],
   ...,
   [10.        ,  0.        , -0.5655    , ...,  0.        ,
     0.        ,  0.        ],
   [10.        ,  0.        ,  0.9150001 , ...,  0.        ,
     0.        ,  0.        ],
   [10.        ,  0.        ,  1.0005    , ...,  0.        ,
     0.        ,  0.        ]], dtype=float32)]

Затем я изменяю его так, чтобы он имел форму (590,1):

XsN_2 = XsN.reshape(-1,1)

Теперь, когда я использую StandardScaler:

from sklearn.preprocessing import StandardScaler

standardized_data = StandardScaler().fit_transform(XsN_2)

Я получаю ошибку что

TypeError: only size-1 arrays can be converted to Python scalars

и

ValueError: setting an array element with a sequence.

Я понимаю, что пытается найти число, но вместо этого находит ndarray, но я не совсем уверен, как стандартизировать данные формы (590, ) где каждый элемент является собственным ndarray.

Редактировать 1:

Ссылаясь на этот CSV-файл: https://gofile.io/?c=YGxCWQ

Вот некоторый код с примерами данных:

import pandas as pd
from sklearn.preprocessing import StandardScaler

imp = pd.read_csv('foo.csv', sep=',', header=None)
data = imp.values
print(data)

standardized_data = StandardScaler().fit_transform(data)

Ошибка, которую я получаю сейчас:

ValueError: could not convert string to float

Можно ли как-то стандартизировать эти данные?

1 Ответ

0 голосов
/ 26 апреля 2020

Без доступа к вашим исходным данным в виде действительного файла .csv это немного сложно отладить. Судя по тому, что вы напечатали, кажется, что XsN - это список массивов, так что вы можете захотеть l oop через каждый по очереди или преобразовать его в массив с расширенными измерениями.

Вот пример стандартизации некоторых фиктивных данных, которые, я думаю, напоминают структуру ваших данных. Надеюсь, это поможет.

n = 100 

# Create feature 1
mean1 = 10 
standard_dev1 = 2
col1 = np.random.normal(loc=mean1,scale=standard_dev1,size=[n,1])

# Create feature 2
mean2 = 20
standard_dev2 = 4
col2 = np.random.normal(loc=mean2,scale=standard_dev2,size=[n,1])

data = np.concatenate([col1,col2],axis=1)

print(f"means of raw data: {data.mean(axis=0)}")
>>> 
means of raw data: [10.15783287 19.82541124]


print(f"standard devations of raw data: {data.std(axis=0)}")
>>>
standard devations of raw data: [2.00049111 3.87277793]


from sklearn.preprocessing import StandardScaler

standardized_data = StandardScaler().fit_transform(data)

print(f"means of standardized data: {standardized_data.mean(axis=0)}")
>>> 
means of standardized data: [-6.92779167e-16 -1.78745907e-15]

print(f"standard devations of standardized data: {standardized_data.std(axis=0)}")
>>> 
standard devations of standardized data: [1. 1.]
...