变形
reshape(行,列)函数可以很方便的将数组进行变形。
reshape()输出的结果是一行一行输出
例如将一维数组变形为二维数组
import numpy as np
np.array(range(1,10)).reshape(3,3) # 其中的np.array(range(1,10)) 可被替换为np.arange(1,10)
Out[35]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
通过reshape可以将数组变形,另外一种方式就是通过np.newaxis 形式。
# 通过newaxis获得的行向量
x[np.newaxis, :]
拼接
两个数组可以由 np.concatenate实现拼接
x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
np.concatenate([x, y])
Out[43]: array([1, 2, 3, 3, 2, 1])
你也可以一次性拼接两个以上数组:
In[44]: z = [99, 99, 99]
print(np.concatenate([x, y, z]))
[ 1 2 3 3 2 1 99 99 99]
np.concatenate 也可以用于二维数组的拼接:
In[45]: grid = np.array([[1, 2, 3],
[4, 5, 6]])
行级拼接(行式拼接,第一个数组走完,行式拼接第二个)
In[46]: # 沿着第一个轴拼接
np.concatenate([grid, grid])
Out[46]: array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])
列级拼接,把第一个数组的一行当做一列,同理第二个数组的一行做当另外一列,两列拼接组成新的一行,其中发挥作用的是 axis = 1.
In[47]: # 沿着第二个轴拼接(从0开始索引)
np.concatenate([grid, grid], axis=1)
Out[47]: array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])
np.vstack (垂直栈)可以实现 行级拼接 vertical
np.hstack (水平栈)可以实现 列级拼接 Horizontal
In[48]: x = np.array([1, 2, 3])
grid = np.array([[9, 8, 7],
[6, 5, 4]])
# 垂直栈数组
np.vstack([x, grid])
Out[48]: array([[1, 2, 3],
[9, 8, 7],
[6, 5, 4]])
In[49]: # 水平栈数组
y = np.array([[99],
[99]])
np.hstack([grid, y])
Out[49]: array([[ 9, 8, 7, 99],
[ 6, 5, 4, 99]])
与之类似, np.dstack 将沿着第三个维度拼接数组。
分裂
分裂可以通过 np.split 、 np.hsplit 和 np.vsplit 函数来实现
可以向以上函数传递一个索引列表作为参数,索引列表记录的是分裂点位置:
In[50]: x = [1, 2, 3, 99, 99, 3, 2, 1]
x1, x2, x3 = np.split(x, [3, 5])
print(x1, x2, x3)
[1 2 3] [99 99] [3 2 1]
以上例子有两个分裂点,也就是在所以为3,5处分裂。
所以,N 分裂点会得到 N + 1 个子数组。
np.hsplit 水平分割
和 np.vsplit 垂直分割
In[51]: grid = np.arange(16).reshape((4, 4))
grid
Out[51]: array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In[52]: upper, lower = np.vsplit(grid, [2])
print(upper)
print(lower)
[[0 1 2 3]
[4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]
In[53]: left, right = np.hsplit(grid, [2])
print(left)
print(right)
[[ 0 1]
[ 4 5]
[ 8 9]
[12 13]]
[[ 2 3]
[ 6 7]
[10 11]
[14 15]]
同样, np.dsplit 将数组沿着第三个维度分裂。