如果我要将矩阵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
有更好的方法吗?我觉得这是一个非常常见的操作。
答案 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
上下文中更常见时,我想到的问题是
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 adds a dminesion
train_inputs = train[:,: -1]
train_outputs = train[:, -1]