06 numpy.array 分割和合并
import numpy as np
numpy.array 的分割
x = np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
切成3段 [0,3) [3,7) [7,最后)
x1, x2, x3 = np.split(x, [3, 7])
x1
array([0, 1, 2])
x2
array([3, 4, 5, 6])
x3
array([7, 8, 9])
分成两段
x1, x2 = np.split(x, [5])
x1
array([0, 1, 2, 3, 4])
x2
array([5, 6, 7, 8, 9])
A = np.arange(16).reshape((4, 4))
A
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
[2]只有一个表示行 ,默认基于"行" 的维度 也就是0 轴
A1, A2 = np.split(A, [2])
A1
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
A2
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])
当然我们也可以进行列方向的分割
A1, A2 = np.split(A, [2], axis=1)
A1
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]])
A2
array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])
在垂直方向上分割 就是有上下 两 部分 upper, lower 如果写1就是上边[1, 2, 3, 4] 下面有3行
upper, lower = np.vsplit(A, [2])
upper
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
lower
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])
left, right = np.hsplit(A, [2])
left
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]])
right
array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])
那么分割数据到底有什么实际意义呢?
data = np.arange(16).reshape((4, 4))
data
以上数据可以代表4 x 4 的矩阵 ,很有可能是4个样本(4行)对于每个样本有3个特征,最后一列代表我们样本的label也就是我们的目标值,他有可能是一个类别也可能是一个连续的数,比如说表示他是猫还是狗,房子的价格等
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
X, y = np.hsplit(data, [-1])
X
array([[ 0, 1, 2],
[ 4, 5, 6],
[ 8, 9, 10],
[12, 13, 14]])
y
array([[ 3],
[ 7],
[11],
[15]])
得到的y是矩阵,变成向量
y[:, 0]
array([ 3, 7, 11, 15])
numpy.array 的合并
x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
np.concatenate([x, y])
array([1, 2, 3, 3, 2, 1])
z = np.array([666, 666, 666])
np.concatenate([x, y, z])
array([ 1, 2, 3, 3, 2, 1, 666, 666, 666])
A = np.array([[1, 2, 3],
[4, 5, 6]])
np.concatenate([A, A])
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])
np.concatenate([A, A], axis=1)
array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])
np.concatenate([A, z])
concatenate( )只能处理相同维数
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
in ()
----> 1 np.concatenate([A, z])
ValueError: all the input arrays must have same number of dimensions
一定要进行拼接的话变化一下z的维度
np.concatenate([A, z.reshape(1, -1)])
array([[ 1, 2, 3],
[ 4, 5, 6],
[666, 666, 666]])
np.vstack 可以智能的进行拼接
np.vstack([A, z])
array([[ 1, 2, 3],
[ 4, 5, 6],
[666, 666, 666]])
有了垂直那么自然也就有了水平
B = np.full((2,2), 100)
np.hstack([A, B])
array([[ 1, 2, 3, 100, 100],
[ 4, 5, 6, 100, 100]])
虽然智能,但如果传入的参数非法也是不行的A, z在垂直方向上可以合并, 但是水平不行
np.hstack([A, z])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
in ()
----> 1 np.hstack([A, z])
/anaconda3/lib/python3.6/site-packages/numpy/core/shape_base.py in hstack(tup)
286 return _nx.concatenate(arrs, 0)
287 else:
--> 288 return _nx.concatenate(arrs, 1)
289
290
ValueError: all the input arrays must have same number of dimensions