修改数组的尺寸

数组的尺寸就是每个维度上元素数量构成的元组,有几种方法可以改变数组的尺寸。

  1. import numpy as np
  2. a = np.array([[1, 2, 3], [3, 2, 1]])
  3. print(a.shape) # (2, 3)

ndarray.reshape()

返回一个新的数组对象,数组中的元素和原数组是共享的,只是尺寸(属性)不同,如果对其中一个数组的元素进行修改,另外一个也会受影响,如果需要全新、独立的数组,请手动调用ndarray.copy()方法。

  1. import numpy as np
  2. a = np.arange(6)
  3. b = a.reshape(2, 3)
  4. print(repr(b))
  5. # array([[0, 1, 2],
  6. # [3, 4, 5]])
  7. a[0] = 999
  8. print(b)
  9. # [[999 1 2]
  10. # [ 3 4 5]]
  11. """
  12. 如果参数中有一个维度为 -1,那这个维度的大小会自动计算
  13. 新的尺寸如果不合理,会抛出 ValueError
  14. """
  15. print(a.reshape(2, -1).shape) # (2, 3)
  16. print(a.reshape(3, -1).shape) # (3, 2)
  17. print(a.reshape(6, -1).shape) # (6, 1)
  18. print(a.reshape(4, -1).shape) # ValueError: cannot reshape array of size 6 into shape (4,newaxis)

ndarray.resize()

reshape()方法是修改尺寸后返回一个新的数组,resize()则是在原数组上进行修改。

  1. import numpy as np
  2. a = np.arange(6)
  3. a.resize(2, 3) # 没有返回值
  4. print(a)
  5. # [[ 0 1]
  6. # [ 2 3]
  7. # [ 4 5]]

ndarray.ravel()

返回一个连续的「扁平数组」,可以理解为是将所有元素在一个维度上摊开了,怎样摊开,是需要有顺序要求的,默认是C style(行元素优先)。同样地,和原数组是共享元素的,一方修改,另一方受影响。

  1. import numpy as np
  2. a = np.array([[1, 2], [3, 4]])
  3. c = a.ravel()
  4. print(c) # [1 2 3 4]
  5. f = a.ravel(order='F') # Fortran style, 列优先
  6. print(f) # [1 3 2 4]

多个数组的合并

numpy.hstack()

字面意思是按照水平方向合并,更准确的说应该是对于多维数组,按照第二维度合并;对于一位数组,按照第一维度合并。

  1. import numpy as np
  2. a = np.array([1, 2, 3])
  3. b = np.array([4, 5, 6])
  4. c = np.hstack((a, b)
  5. print(c) # [1 2 3 4 5 6]
  6. x = np.array([[1, 2], [3, 4], [5, 6]])
  7. y = np.array([[7], [8], [9]])
  8. """
  9. x 第二维度索引:(0, 1)
  10. y 第二维度索引:(0)
  11. 合并之后的第二维度索引:(0, 1, 2)
  12. """
  13. z = np.hstack((x, y))
  14. print(z)
  15. # [[1 2 7]
  16. # [3 4 8]
  17. # [5 6 9]]

numpy.vstack()

和上面的类似,垂直方向合并,扩展第一维度。

  1. import numpy as np
  2. a = np.array([1, 2, 3])
  3. b = np.array([2, 3, 4])
  4. c = np.vstack((a,b))
  5. print(c)
  6. # [[1 2 3]
  7. # [2 3 4]]
  8. x = np.array([[1, 2], [3, 4]])
  9. y = np.array([[6, 7]])
  10. z = np.vstack((x, y))
  11. print(z)
  12. # [[1 2]
  13. # [3 4]
  14. # [6 7]]

数组的拆分

numpy.split()

将一个数组拆分成多个子数组,返回子数组构成的列表。

  1. """
  2. numpy.split(array, indices_or_sections, axis=0)
  3. - indices_or_sections:整形或者一维数组
  4. 1. 如果是整数,则将数组按照对应维度「均分」,不能均分,抛出异常
  5. 2. 如果是一维数组,则以数组元素值为切片分割点,进行切片分割
  6. """
  7. import numpy as np
  8. x = np.arange(9)
  9. arr_list = np.split(x, 3)
  10. print(arr_list) # [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
  11. arr_list = np.split(x, [1, 3, 5])
  12. """
  13. 分成:[:1], [1:3], [3:5], [5:]
  14. """
  15. print(arr_list) # [array([0]), array([1, 2]), array([3, 4]), array([5, 6, 7, 8])]
  16. # 多维数组
  17. a = np.arange(18).reshape(3, 6)
  18. arr_list = np.split(a, 3, axis=1) # 按第二维(列)分
  19. for arr in arr_list:
  20. print(arr, end= '\n\n')
  21. # [[ 0 1]
  22. # [ 6 7]
  23. # [12 13]]
  24. #
  25. # [[ 2 3]
  26. # [ 8 9]
  27. # [14 15]]
  28. #
  29. # [[ 4 5]
  30. # [10 11]
  31. # [16 17]]