修改数组的尺寸
数组的尺寸就是每个维度上元素数量构成的元组,有几种方法可以改变数组的尺寸。
import numpy as np
a = np.array([[1, 2, 3], [3, 2, 1]])
print(a.shape) # (2, 3)
ndarray.reshape()
返回一个新的数组对象,数组中的元素和原数组是共享的,只是尺寸(属性)不同,如果对其中一个数组的元素进行修改,另外一个也会受影响,如果需要全新、独立的数组,请手动调用ndarray.copy()
方法。
import numpy as np
a = np.arange(6)
b = a.reshape(2, 3)
print(repr(b))
# array([[0, 1, 2],
# [3, 4, 5]])
a[0] = 999
print(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 np
a = np.arange(6)
a.resize(2, 3) # 没有返回值
print(a)
# [[ 0 1]
# [ 2 3]
# [ 4 5]]
ndarray.ravel()
返回一个连续的「扁平数组」,可以理解为是将所有元素在一个维度上摊开了,怎样摊开,是需要有顺序要求的,默认是C style
(行元素优先)。同样地,和原数组是共享元素的,一方修改,另一方受影响。
import numpy as np
a = 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 np
a = 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 np
a = 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 np
x = 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]]