如果我有一个矩阵Xy
,我想拆分为矩阵X
和数组y
,我通常这样做
X, y = Xy[:, :-1], Xy[:, -1]
有没有更好的方法来使用scikit-learn
或numpy
来做到这一点?我觉得这是一个非常常见的操作。
您可以使用 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, ...
X
和y
是 2D 和 1D 数组,在本例中是从 pandas 数据帧的列中提取的。 train_test_split
用于将X
和y
拆分为训练组和测试组。 如果有特殊的X,y
分离器,它将在sklearn
包中,而不是numpy
.
Python - NumPy array_split 增加了一个 dminesion
train_inputs = train[:,: -1]
train_outputs = train[:, -1]