Numpy 简单教程(二)数组的形状(shape)操作
2020-08-15 本文已影响0人
超级超级小天才
更过的Numpy教程连载内容:https://www.jianshu.com/nb/47449944
Numpy数组的形状(shape)操作
首先,使用 ndarray.shape
可以返回数组的形状
改变Numpy数组形状的方法
以下的操作均不改变原数组,而是返回一个新的更改后的数组:
-
ndarray.ravel()
: 返回展平后的数组,按照一行跟这一行的方式展开。Numpy创建数组的一般方式也是按照先创建一个展平的数组然后按行变形成数组的形式,所以一般的ravel操作不会再对原数组进行复制,但是使用其他方式创建的数组,比如切片操作等就要复制一份了 -
numpy.ravel(A, order='C')
: 全局函数,返回A展平后的数组 -
ndarray.reshape(ints/tuple)
: 复制一个新的数组并进行reshape然后返回,不改变原数组,参数可以是多个整数或者一个tuple。使用多个int值作为参数时,可以保留一个 -1 表示不知道该处的大小是多少。 -
numpy.reshape(A,tuple,order='C')
: numpy的全局方法,对A进行reshape并返回 -
ndarray.resize(ints/tuple)
:对原数组进行reshape,改变原数组 -
numpy.resize(A,tuple)
:对A进行reshape,改变A本身 -
ndarray.T
:返回原数组的转置,不改变原数组
数组的拼接
-
纵向拼接(行长不变摞加列):
-
np.vstack(tuple)
:参数是有多个numpy数组组成的tuple -
np.row_stack(tuple)
: 等同于上边的
a = np.array([[1,2],[3,4]]) b = np.array([[5,6],[7,8]]) print(np.vstack((a,b))) print(np.row_stack((a,b))) print(np.vstack is np.row_stack) ------ [[1 2] [3 4] [5 6] [7 8]] [[1 2] [3 4] [5 6] [7 8]] True
-
-
横向拼接(列长不变摞加行):
-
np.hstack(tuple)
:参数是有多个numpy数组组成的tuple -
np.column_stack(tuple)
: 在处理二维数组时等同于上边hstack的功能,处理一维数组时将多个一维数组按列拼接成二维数组。只能处理一维或者二维数组,参数是多个以为或者二维数组的tuple。
a = np.array([[1,2],[3,4]]) b = np.array([[5,6],[7,8]]) print(np.hstack((a,b))) print(np.column_stack((a,b))) print(np.hstack is np.column_stack) a = np.array([4.,2.]) b = np.array([3.,8.]) print(np.column_stack((a,b))) print(np.hstack((a,b))) ------ [[1 2 5 6] [3 4 7 8]] [[1 2 5 6] [3 4 7 8]] False [[4. 3.] [2. 8.]] [4. 2. 3. 8.]
-
-
多维数组拼接
-
vstack
沿着第一个轴拼接 -
hstack
沿着第二个轴拼接 -
numpy.concatenate((a1, a2, ...), axis=0, out=None)
:指定一个轴进行拼接
-
-
另外的简单方式
-
numpy.r_[]
: 返回有中括号内的多个数组沿第一个轴拼接的结果 -
numpy.c_[]
: 返回有中括号内的多个数组沿第二个轴拼接的结果
print(np.r_[1:5,0,8]) print(np.c_[np.array([1,2,3]), np.array([4,5,6])]) print(np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])]) ------ [1 2 3 4 0 8] [[1 4] [2 5] [3 6]] [[1 2 3 0 0 4 5 6]]
-
数组的分割
-
numpy.vsplit(A, indices_or_sections)
: 将A沿着第一轴分割,也就是横着切一个二维数组 -
numpy.hsplit(A, indices_or_sections)
: 将A沿着第二轴分割,也就是竖着切一个二维数组 -
numpy.array_split(A, indices_or_sections, axis=0)
: 指定沿着axis轴分割
以上函数中第二个参数可以是整数也可以是序列(tuple、array、list等)
-
整数:表示平均分成多少份:
a = np.arange(24).reshape(4,6) print(a) print(np.vsplit(a,2)) print(np.hsplit(a,3)) ------ [[ 0 1 2 3 4 5] [ 6 7 8 9 10 11] [12 13 14 15 16 17] [18 19 20 21 22 23]] [array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11]]), array([[12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23]])] [array([[ 0, 1], [ 6, 7], [12, 13], [18, 19]]), array([[ 2, 3], [ 8, 9], [14, 15], [20, 21]]), array([[ 4, 5], [10, 11], [16, 17], [22, 23]])]
-
tuple等序列:表示分别在第几列后边分割一次:
a = np.arange(24).reshape(4,6) print(a) print(np.vsplit(a,(2,3,4))) print(np.hsplit(a,(2,3,5))) ------ [[ 0 1 2 3 4 5] [ 6 7 8 9 10 11] [12 13 14 15 16 17] [18 19 20 21 22 23]] [array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11]]), array([[12, 13, 14, 15, 16, 17]]), array([[18, 19, 20, 21, 22, 23]]), array([], shape=(0, 6), dtype=int32)] [array([[ 0, 1], [ 6, 7], [12, 13], [18, 19]]), array([[ 2], [ 8], [14], [20]]), array([[ 3, 4], [ 9, 10], [15, 16], [21, 22]]), array([[ 5], [11], [17], [23]])]
给数组新增维度
-
使用
np.newaxis
给数组增加一个维度
np.newaxis
每使用一次都可以给数组增加一个维度,只要在需要拓展的维度使用np.newaxis
作为索引进行切片操作就可以了:>>>a = np.array([1, 2, 3, 4, 5, 6]) >>> a.shape (6,) >>>a2 = a[np.newaxis, :] >>> a2.shape (1, 6)
-
使用
np.expand_dims
给数组增加一个维度
np.expand_dims(A,axis=?)
可以对传入的A数组增加一个指定的axis
新轴,从而扩展数组的维度:>>> a = np.array([1, 2, 3, 4, 5, 6]) >>> a.shape (6,) >>> b = np.expand_dims(a, axis=1) >>> b.shape (6, 1) >>> c = np.expand_dims(a, axis=0) >>> c.shape (1, 6)