【问题标题】:Split Xy matrix into X and y将 Xy 矩阵拆分为 X 和 y
【发布时间】:2017-01-27 23:07:40
【问题描述】:

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

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

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

【问题讨论】:

  • 这仅在learn 框架中很常见。 numpy 术语中的这种拆分并没有什么特别之处。甚至np.split 也会使用这种索引。
  • @hpaulj 如果您批评我对numpy 标签的使用,我将其包括在内,因为我认为会有一个 numpy 方法可以回答我的问题。此外,矩阵本身是一个 numpy 矩阵。此外,如果您正在执行类似numpy.linalg.solve 的操作,也可以在 sklearn 之外使用此方法
  • 应该y 1d 吗?
  • @hpaulj 是的。因此[:, -1] 而不是[:, :-1]
  • 标签没有问题。 sklearn 建立在 numpy 之上。只是我只在sklearn 问题中看到过这种特殊的分裂。

标签: numpy scikit-learn


【解决方案1】:

你可以使用 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 将产生y2D。要拥有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

【讨论】:

  • 我认为 split 使用像 OP 一样的切片索引。[:, :-1],[:,[-1]]
  • 这个y是(4,1)`形状的。
【解决方案2】:

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))

swapaxes 需要axis=1;或没有交换:

 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 ValueError: non-broadcastable output operand with shape (124,1) doesn't match the broadcast shape (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 adds a dminesion

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

【讨论】:

    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多