Python: почему этот массив является объектом, а не плавающим? - PullRequest
0 голосов
/ 10 октября 2018

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

Я вставлю упрощенную версию кода ниже:

import pandas as pd
import numpy as np

dtypes = {'starttime': 'str', 'endtime': 'str', 'hr': 'float', 'sofa_24hours': 'float'}
parse_dates = [2,3]
fields = [0,1,11,12,13,14,15,34,35,36]
reader = pd.read_csv(filename, header=0, names=headers, dtype=dtypes, parse_dates=parse_dates, usecols=fields)
print("Started loading data...")

df = pd.DataFrame(data=reader)
ids = list(df.iloc[:, 0])
id_list = np.unique(ids)
x = df.iloc[:, 2:6].astype(float)
y = df.iloc[:, 7].astype(float)
t = df.iloc[:, 0].astype(float)

x_data = []
y_data = []
t_data = []

for i in range(0,len(id_list)):
    idx = np.where(ids==id_list[i])[0]
    t_data.append(t.values[idx[0]:idx[-1]+1])
    x_data.append(x.values[idx[0]:idx[-1]+1,:])
    y_data.append(y.values[idx[0]:idx[-1]+1])

    if np.mod(i,1000)==0:
        print("Data association... {}%".format(np.round(100*i/len(id_list))))

print("Finished loading data!")

Теперь, когда я проверяю длятип:

In [1]: y.dtype
Out[1]: dtype('float64')

Это кажется правильным.Затем я разбил данные на пакеты, используя:

batch_size=64
W=5

idx_pt = np.random.randint(W,len(x_data),batch_size)
idx_t = [np.random.randint(0,len(x_data[i])-W-1) for i in idx_pt]

batch_x = np.array([x_data[idx_pt[i]][idx_t[i]:idx_t[i]+W,:] for i in range(0,len(idx_pt))])
batch_y = np.array([y_data[idx_pt[i]] for i in range(0,len(idx_pt))])

Когда я проверяю dtype:

In [2]: batch_x.dtype
Out[2]: dtype('float64')

In [3]: batch_y.dtype
Out[3]: dtype('O')

Почему batch_y рассматривается как объект?

1 Ответ

0 голосов
/ 10 октября 2018

Полагаю, последний массив (batch_y) был создан из списка, который содержит пустые массивы различной длины.

У меня нет ваших данных, но следующий код выдает и batch_x, и batch_y как массивы объектов:

import numpy as np

x= np.random.randint(0, high = 10, size=[300,300])
y = np.array(np.random.randint(0, high = 10, size=300), dtype=np.float64)


id_list = np.random.randint(0, high = 10, size=20)
ids = id_list

x_data = []
y_data = []

for i in range(0,len(id_list)):
    idx = np.where(ids==id_list[i])[0]
    x_data.append(x[idx[0]:idx[-1]+1,:])
    y_data.append(y[idx[0]:idx[-1]+1])


batch_size=64
W=5

idx_pt = np.random.randint(W,abs(len(x_data)),batch_size)
idx_t = [np.random.randint(0,abs(len(x_data[i])-W-1)) for i in idx_pt]

batch_x = np.array([x_data[idx_pt[i]][idx_t[i]:idx_t[i]+W,:] for i in range(0,len(idx_pt))])
batch_y = np.array([y_data[idx_pt[i]] for i in range(0,len(idx_pt))])

Причина в том, что y_data уже содержит массивы различной длины:

>>> y_data[0]
array([0., 9., 9., 8., 2., 1., 7., 7., 8., 0.])
>>> y_data[1]
array([9., 9., 8., 2., 1., 7., 7., 8.])
>>> y_data[3]
array([8., 2., 1., 7., 7.])
>>> y_data[4]
array([2., 1., 7., 7., 8., 0., 0., 1.])

Пожалуйста, проверьте ваш входной фрейм данных и то, что вы фактически помещаете в x_data и y_data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...