将 Xy 矩阵拆分为 X 和 y



如果我有一个矩阵Xy,我想拆分为矩阵X和数组y,我通常这样做

X, y = Xy[:, :-1], Xy[:, -1]

有没有更好的方法来使用scikit-learnnumpy来做到这一点?我觉得这是一个非常常见的操作。

您可以使用 NumPy 内置np.split -

X, y = np.split(Xy,[-1],axis=1) # Or simply : np.split(Xy,[-1],1)

示例运行 -

In [93]: Xy
Out[93]: 
array([[6, 2, 0, 5, 2],
       [6, 3, 7, 0, 0],
       [3, 2, 3, 1, 3],
       [1, 3, 7, 1, 7]])
In [94]: X, y = np.split(Xy,[-1],axis=1)
In [95]: X
Out[95]: 
array([[6, 2, 0, 5],
       [6, 3, 7, 0],
       [3, 2, 3, 1],
       [1, 3, 7, 1]])
In [96]: y
Out[96]: 
array([[2],
       [0],
       [3],
       [7]])

请注意,np.split将生成y作为2D。要获得1D切片,我们需要在那里使用np.squeeze(y)

此外,这些切片将是原始数组的视图,因此那里不需要额外的内存 -

In [104]: np.may_share_memory(Xy, X)
Out[104]: True
In [105]: np.may_share_memory(Xy, y)
Out[105]: True

np.split使用np.array_split。 这反过来又做到了:

sub_arys = []
sary = _nx.swapaxes(ary, axis, 0)
for i in range(Nsections):
    st = div_points[i]
    end = div_points[i + 1]
    sub_arys.append(_nx.swapaxes(sary[st:end], axis, 0))

axis=1 需要swapaxes;或不交换:

 sub_arys = []
 for ...:
    sub_arys.append(ary[:, st:end])
 return sub_arys

即与:

In [388]: ary=np.arange(12).reshape(3,4)
In [389]: [ary[:,0:3], ary[:,3:4]]
Out[389]: 
[array([[ 0,  1,  2],
        [ 4,  5,  6],
        [ 8,  9, 10]]), 
 array([[ 3],
        [ 7],
        [11]])]

像这样的split保持原始的维度数。

将代码包装在函数中会提供同样快甚至更快的东西:

def xysplit(ary):
    return ary[:,:-1], ary[:,-1]
X, y = xysplit(ary)

生产:

array([[ 0,  1,  2],
        [ 4,  5,  6],
        [ 8,  9, 10]]), 
array([ 3,  7, 11])

当我评论说这似乎在sklearn上下文中更常见时,我想到了诸如以下问题:

Python 值错误:形状为 (124,1) 的不可广播输出操作数与广播形状 (124,13) 不匹配

X = df_wine.iloc[:, 1:].values
y = df_wine.iloc[:, 0].values
....
X_train, X_test, y_train, y_test = train_test_split(X, y, ...

Xy是 2D 和 1D 数组,在本例中是从 pandas 数据帧的列中提取的。 train_test_split用于将Xy拆分为训练组和测试组。 如果有特殊的X,y分离器,它将在sklearn包中,而不是numpy .

Python - NumPy array_split 增加了一个 dminesion

 train_inputs = train[:,: -1]
 train_outputs = train[:, -1]

相关内容

  • 没有找到相关文章

最新更新