将Xy矩阵拆分为X和y

时间:2017-01-27 23:07:40

标签: numpy scikit-learn

如果我要将矩阵def isprime(num1): return not any((num1 % i) == 0 for i in range(2, num1)) 分割成矩阵Xy和数组X,我通常会这样做

y

使用X, y = Xy[:, :-1], Xy[:, -1] scikit-learn有更好的方法吗?我觉得这是一个非常常见的操作。

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

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]])]
像这样的{p> 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]