修改数组的尺寸
数组的尺寸就是每个维度上元素数量构成的元组,有几种方法可以改变数组的尺寸。
import numpy as npa = np.array([[1, 2, 3], [3, 2, 1]])print(a.shape) # (2, 3)
ndarray.reshape()
返回一个新的数组对象,数组中的元素和原数组是共享的,只是尺寸(属性)不同,如果对其中一个数组的元素进行修改,另外一个也会受影响,如果需要全新、独立的数组,请手动调用ndarray.copy()方法。
import numpy as npa = np.arange(6)b = a.reshape(2, 3)print(repr(b))# array([[0, 1, 2],# [3, 4, 5]])a[0] = 999print(b)# [[999 1 2]# [ 3 4 5]]"""如果参数中有一个维度为 -1,那这个维度的大小会自动计算新的尺寸如果不合理,会抛出 ValueError"""print(a.reshape(2, -1).shape) # (2, 3)print(a.reshape(3, -1).shape) # (3, 2)print(a.reshape(6, -1).shape) # (6, 1)print(a.reshape(4, -1).shape) # ValueError: cannot reshape array of size 6 into shape (4,newaxis)
ndarray.resize()
reshape()方法是修改尺寸后返回一个新的数组,resize()则是在原数组上进行修改。
import numpy as npa = np.arange(6)a.resize(2, 3) # 没有返回值print(a)# [[ 0 1]# [ 2 3]# [ 4 5]]
ndarray.ravel()
返回一个连续的「扁平数组」,可以理解为是将所有元素在一个维度上摊开了,怎样摊开,是需要有顺序要求的,默认是C style(行元素优先)。同样地,和原数组是共享元素的,一方修改,另一方受影响。
import numpy as npa = np.array([[1, 2], [3, 4]])c = a.ravel()print(c) # [1 2 3 4]f = a.ravel(order='F') # Fortran style, 列优先print(f) # [1 3 2 4]
多个数组的合并
numpy.hstack()
字面意思是按照水平方向合并,更准确的说应该是对于多维数组,按照第二维度合并;对于一位数组,按照第一维度合并。
import numpy as npa = np.array([1, 2, 3])b = np.array([4, 5, 6])c = np.hstack((a, b)print(c) # [1 2 3 4 5 6]x = np.array([[1, 2], [3, 4], [5, 6]])y = np.array([[7], [8], [9]])"""x 第二维度索引:(0, 1)y 第二维度索引:(0)合并之后的第二维度索引:(0, 1, 2)"""z = np.hstack((x, y))print(z)# [[1 2 7]# [3 4 8]# [5 6 9]]
numpy.vstack()
和上面的类似,垂直方向合并,扩展第一维度。
import numpy as npa = np.array([1, 2, 3])b = np.array([2, 3, 4])c = np.vstack((a,b))print(c)# [[1 2 3]# [2 3 4]]x = np.array([[1, 2], [3, 4]])y = np.array([[6, 7]])z = np.vstack((x, y))print(z)# [[1 2]# [3 4]# [6 7]]
数组的拆分
numpy.split()
将一个数组拆分成多个子数组,返回子数组构成的列表。
"""numpy.split(array, indices_or_sections, axis=0)- indices_or_sections:整形或者一维数组1. 如果是整数,则将数组按照对应维度「均分」,不能均分,抛出异常2. 如果是一维数组,则以数组元素值为切片分割点,进行切片分割"""import numpy as npx = np.arange(9)arr_list = np.split(x, 3)print(arr_list) # [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]arr_list = np.split(x, [1, 3, 5])"""分成:[:1], [1:3], [3:5], [5:]"""print(arr_list) # [array([0]), array([1, 2]), array([3, 4]), array([5, 6, 7, 8])]# 多维数组a = np.arange(18).reshape(3, 6)arr_list = np.split(a, 3, axis=1) # 按第二维(列)分for arr in arr_list:print(arr, end= '\n\n')# [[ 0 1]# [ 6 7]# [12 13]]## [[ 2 3]# [ 8 9]# [14 15]]## [[ 4 5]# [10 11]# [16 17]]
