【问题标题】:Python: why is this array an object instead of a float?Python:为什么这个数组是对象而不是浮点数?
【发布时间】:2019-03-15 05:21:35
【问题描述】:

我正在尝试订购数据并为每个唯一 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,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 视为对象?

【问题讨论】:

    标签: python arrays numpy object types


    【解决方案1】:

    我想最后一个数组 (batch_y) 是从一个包含不同长度的 numpy 数组的列表中创建的。

    我没有您的数据,但以下代码将 batch_xbatch_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_datay_data 的内容。

    【讨论】:

    • 正确,y_data 包含不同长度的数组。但是长度和x_data一样:len(y_data[0]) = 74,len(x_data[1]) = 143,len(x_data[0]) = 74,len(x_data[1])= 143
    • 然后batch_y 将具有对象dtype。你可以检查np.array([[1,2,3],[1,2,3]])np.array([[1,2,3],[1,2]])的dtype,第一个是int,第二个是object。
    • 对我个人而言,如果没有输入数据(原始数据帧),很难猜测,但如果您确实是从不同长度的块创建数组,那么真正的问题是为什么 batch_x 仍然是浮动的.
    • 我想通了。事实证明,我没有将data_y 切成等长的w。这是工作代码:batch_y = np.array([y_data[idx_pt[i]][idx_t[i]+W] for i in range(0,len(idx_pt))])dtype = float64
    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2018-09-29
    • 2018-03-23
    • 1970-01-01
    • 2011-10-06
    • 2014-09-27
    • 2010-09-07
    相关资源
    最近更新 更多