2017-01-27 89 views
1

如果我有一个矩阵Xy,我想分成矩阵X和阵列y,我通常做这个拆分XY矩阵为X和Y

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

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

+0

只有'learn'框架内很常见。 “numpy”这样的分裂没有什么特别之处。即使'np.split'也会使用这种索引。 – hpaulj

+0

@hpaulj如果你批评我使用'numpy'标签,我将它包含在内,因为我认为会有一种可以解决我问题的方法。此外,矩阵本身是一个numpy矩阵。此外,如果你正在做'numpy.linalg.solve'这样的方法,也可以在sklearn之外使用这个方法。 – michaelsnowden

+0

'y'应该是1d吗? – hpaulj

回答

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会产生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 
+0

我认为拆分使用像OP的分片索引,'[:,:-1],[:,[ - 1]]' – hpaulj

+0

这个'y'是(4,1)'形。 – hpaulj

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

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阵列,在这种情况下从熊猫数据帧的列中拉出。 train_test_split用于将Xy分成训练和测试组。如果有特殊的X,y分路器,它将位于sklearn包中,而不是numpy

Python - NumPy array_split adds a dminesion

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