目录
2.4 hstack,vstack,dstack,stack详解
通过reshape方法可以将一维数组变成二维、三维或者多维数组, 也可以通过reshape方法将多维数组变成一维。注意:reshape的ndarray对象的实例方法。
通过ravel方法或flatten方法可以将多维数组变成一维数组。
改变数组的维度还可以直接设置Numpy数组的shape属性(元组类型),通过resize方法也可以改变数组的维度,resize方法的参数是一个元组。
- import numpy as np
-
- # 创建一维的数组
- a = np.arange(24)
- # 使用reshape将一维数组变成三维数组
- b = a.reshape(2, 3, 4) # 2x3x4=24
- # 将a变成二维数组
- c = a.reshape(3, 8)
- # 将多维数组变成一维数组
- print(c.reshape(-1))
- ##############################################
- # 使用ravel函数将三维的b变成一维的数组
- a1 = b.ravel()
- # 使用flatten函数将二维的c变成一维的数组
- a2 = c.flatten()
- # 使用shape属性将三维的b变成二维数组(6行4列)
- b.shape = (6, 4)
- # 使用resize修改数组的维度
- b.resize((2, 12))
由下图可知,矩阵的拼接需要格式相同,行数或者列数至少有一个要一致。


语法格式:np.concatenate((a1, a2, ...), axis),axis取0,1,2,……,表示每个维度的轴x,y,z……。a1,a2,a3,……是形状相同的数组。
- import numpy as np
-
- x = np.arange(1, 4)
- y = np.arange(4, 7)
- print(np.concatenate((x, y), axis=0))
hstack,vstack,dstack分别对应水平,垂直,正交三个方向的拼接。dstack在三维矩阵的第三个方向进行拼接。
stack()函数的原型是numpy.stack(arrays, axis=0),即将一堆数组的数据按照指定的方向进行堆叠。参数如下:stack([a1,a2,……],axis),stack的axis只能取0和1,因为stack只能用一维数组拼二维矩阵。
vstack,dstack,stack已经指定了拼接方向,参数如下:([a1,a2,……])。
注意:上述所有方法返回的都是ndarray矩阵对象。
即:行列互换。

- import numpy as np
-
- # transpose进行转置
- # 二维转置
- a = np.arange(1, 13).reshape(2, 6)
- print('原数组a')
- print(a)
- print('转置后的数组')
- print(a.transpose()) # 作为ndarray对象的实例方法,也可以使用np.transcope()函数
- print(a.T)
一般只进行二维矩阵的转置。二维矩阵的转置也可以使用np.transcope()函数,参数如下:(ndarray,(1,0)),第二个参数是一个元组,一般为(1,0)表示x和y互换。

注意:分隔之后将结果放入一个列表返回,列表的每个元素的类型为ndarray。
函数详解:numpy.split(ary, indices_or_sections, axis)。
ary:被分隔的对象;
indices_or_sections:如果是一个整数,就用该数平均切分(需要确保能够被整分)。如果是一个数组,为沿轴切分的位置 (左开右闭), 如indices_or_sections=[2,5]表示把ary从0-2分一份,2-5分一份,5至-1为一份。
axis:轴的序号。当分隔二维矩阵时,需要指定axis=0或者1。
- import numpy as np
-
- x = np.arange(1, 9)
- a = np.split(x, 4)
- print(a)
- print(a[0])
- print(a[1])
- print(a[2])
- print(a[3])
- # 传递数组进行分隔
- b = np.split(x, [3, 5])
- print(b)
- # [array([1, 2]), array([3, 4]), array([5, 6]), array([7, 8])]
- # [1 2]
- # [3 4]
- # [5 6]
- # [7 8]
- # [array([1, 2, 3]), array([4, 5]), array([6, 7, 8])
用于分隔矩阵,他们的参数,(ary,x:int),需注意可被int整分。他们已经指定了axis的值。
由于numpy是基于矩阵进行运算,所以numpy的数学函数会自动将矩阵中的数据进行遍历运算,即使是二维矩阵也会全部遍历。

- import numpy as np
-
- x = np.arange(1, 9, dtype=float)
- print(np.reciprocal(x))
- y = np.arange(1, 13, dtype=float).reshape(3, 4)
- print(np.reciprocal(y))
算数运算符+,-,x,/,**,%等实际上都是函数实现的。如果参与运算的两个对象都是ndarray,并且形状相同,那么会对彼此之间进行(+ - * /)运算。注意进行运算的前提是:两个或多个矩阵满足运算的shape。
NumPy 算术函数包含简单的加减乘除: add(),subtract(),multiply()。即:+对于add,-对于substact……。
注意这里的运算只是矩阵对应元素的加减乘除,并不是线性代数中的矩阵乘法。线代中的矩阵乘法使用matmul(a1,a2)或者点乘np.(a1,a2)。
- import numpy as np
-
- a = np.arange(9, dtype=np.float).reshape(3, 3)
- b = np.array([10, 10, 10])
- print(np.add(a, b))
- print(a + b)
- print(np.subtract(a, b))
- print(a - b)
- print(np.multiply(a, b))
- print(a * b)
- print(np.divide(a, b))
- print(a / b)
out参数的使用,当需要接受计算结果时,用out指定一个empty矩阵的进行接受即可。
- x = np.arange(5)
- y = np.empty_like(x)
- np.multiply(x, 10, out=y)
- print(y)
numpy.mod() 计算输入数组中相应元素的相除后的余数。函数 numpy.remainder() 也产生相同的结果。

- import numpy as np
-
- # power()函数的使用
- x = np.arange(1, 5)
- y = np.empty_like(x)
- np.power(x, 2, out=y)
- print(y)
-
- # median ()函数的使用
- a = np.array([4, 2, 1, 5])
- # 计算偶数的中位数
- print('偶数的中位数:', np.median(a))
- a = np.array([4, 2, 1])
- print('奇数个的中位数:', np.median(a))
- a = np.arange(1, 16).reshape(3, 5)
- print('调用median函数')
- print(np.median(a))
- print('调用median函数,axis=1 行的中值')
- print(np.median(a, axis=1))
- print('调用median函数,axis=0 列的中值')
- print(np.median(a, axis=0))
-
- # mean()函数的使用
- a = np.arange(1, 11).reshape(2, 5)
- print(np.mean(a))
- print('调用mean函数 axis=0 列')
- print(np.mean(a, axis=0))
- print('调用mean函数 axis=1 行')
- print(np.mean(a, axis=1))
-
- # 函数的使用
- a = np.random.randint(10, 50, size=20)
- np.max(a)
- np.sum(a)
- np.min(a)
- np.max(a)
- np.ptp(a)
- np.unique(a)
- np.nonzero(a)
