Python numpy 入门系列 22 合并ndarray
ndarray的合并
定义要使用的数据源
a = np.array([1, 1, 1]) b = np.array([2, 2, 2]) print('a', a) print('b', b)
<class 'numpy.ndarray'>
a [1 1 1]
b [2 2 2]
numpy.vstack()函数
语法:vstack(tup),参数是一个元组,它可将元组中指定的数组进行合并
# 将a与b合并 c = np.vstack((a, b)) print('合并结果:\n', c) print('c的形状:\n', c.shape)
合并结果:
[[1 1 1]
[2 2 2]]
c的形状:
(2, 3)
从结果来看,两个一维数组合并后的结果是一个二维数组
numpy.hstack()函数
语法:hstack(tup),参数是一个元组
与 vstack不同的是,vstack将数组进行纵向合并,而hstack将数组进行横向合并
vstack 是 vertical stack 的缩写
hstack 是 horizontal stack 的缩写
# 将a与b合并 c = np.hstack((a, b)) print('合并结果:\n', c) print('c的形状:\n', c.shape)
合并结果:
[1 1 1 2 2 2]
c的形状:
(6,)
可以看出,两个一维数组对象横向合并后,还是一个一维的序列,不过,元素的个数是被合并数组元素个数之和
将a或b行转成列
a = a.T print(a)
[1 1 1]
上面的方式是无法将a进行行转列的,原因是a是个一维数组,它根本就没有列,正确的方式是:
c = a.reshape((3, 1)) print(c)
[[1]
[1]
[1]]
重新定义形状后,现在a是一个3行1列的矩阵,即一个二维数据
思考:a.reshape()是将a所指向的数组的形状改变了吗?再来查看a
print(a)
[1 1 1]
实际上,a.reshape()只是创建了一个a的副本,然后将该副本的内存地址赋给了变量c,而a变量所指向的数组还是原来的对象
newaxis属性
还有另外一组方式可以改变a的形状,也是返回一个 ;axis表示“轴”的意思
# 在行上增加一个维度(增加一个轴) c = a[np.newaxis, :] print(c) print(c.shape) print('-'*15) # 在列上增加一个维度 c = a[:, np.newaxis] print(c) print(c.shape)
[[1 1 1]]
(1, 3)
---------------
[[1]
[1]
[1]]
(3, 1)
可以看出,返回的新对象的维度都已经发生了变化,在列方向上增加维度以后,将原先的一维数组变成了纵向的二维数组
_a = a[:, np.newaxis] _b = b[:, np.newaxis] c = np.hstack((_a, _b)) print(c)
[[1 2]
[1 2]
[1 2]]
也可以将同一个对象进行合并
print(np.hstack((_a, _a, _b, _b)))
[[1 1 2 2]
[1 1 2 2]
[1 1 2 2]]
concatenate()
也可以将数组进行合并,通过axis可以指定合并的方向
# 横向合并 c = np.concatenate((_a, _a, _b, _b), axis=1) # 纵向合并 d = np.concatenate((_a,_b), axis=0) print(c) print('-'*10) print(d)
[[1 1 2 2]
[1 1 2 2]
[1 1 2 2]]
----------
[[1]
[1]
[1]
[2]
[2]
————————————————
REF
链接:https://blog.csdn.net/shipeng1022/article/details/107069140
https://www.codenong.com/cs105209851/
http://c.biancheng.net/view/7209.html
http://www.zzvips.com/article/174390.html