Python:为什么这个数组是一个对象而不是一个浮点?
我试图对数据进行排序,并为每个唯一的ID创建一个数组。 我使用的数据是整数/浮点数列或空单元格(NaN) 我将粘贴以下代码的简化版本:Python:为什么这个数组是一个对象而不是一个浮点?,python,arrays,numpy,object,types,Python,Arrays,Numpy,Object,Types,我试图对数据进行排序,并为每个唯一的ID创建一个数组。 我使用的数据是整数/浮点数列或空单元格(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
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))])
当我检查数据类型时:
In [2]: batch_x.dtype
Out[2]: dtype('float64')
In [3]: batch_y.dtype
Out[3]: dtype('O')
为什么批处理y被视为对象?我想最后一个数组(批处理y)是从包含不同长度的numpy数组的列表中创建的
我没有您的数据,但以下代码生成对象数组形式的batch\u x
和batch\u 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\u数据
和y\u数据
正确,y\u数据包含不同长度的数组。但是,长度与x_数据相同:len(y_数据[0])=74
,len(x_数据[1])=143
,len(x_数据[0])=74
,len(x_数据[1])=143则批处理y
将具有对象数据类型。您可以检查np.array([[1,2,3],[1,2,3]])
和np.array([[1,2,3],[1,2]])
的数据类型,第一个是int,第二个是object。对于我个人来说,没有输入数据(原始数据帧)很难猜测,但是如果您确实是从不同长度的块创建数组,那么真正的问题是为什么批处理仍然是浮动的。我弄明白了。原来我没有把数据y
切成等长的w
。这是工作代码:batch_y=np.array([y_data[idx_pt[i]][idx_t[i]+W]表示范围(0,len(idx_pt))])
<代码>数据类型=浮动64