Python 中经常会使用 Numpy 库来做科学计算。Numpy 的本质就是创建出多维数组,可使用 Numpy 提供的各种科学计算方法对数组进行计算。
多维数组的创建
import numpy as np
# 创建一维数组
arr1 = np.array([1, 2, 3])
# 创建二维数组
arr2 = np.array([[1, 2], [3, 4]])
通过 Numpy 的 array() 方法,就可以创建出多维数组。这样的数组也称之为 Numpy 对象,每个 Numpy 对象都有两个属性,一个是 shape ,另一个是 dtype 。
访问 Numpy 的 shape 属性可以获得数组的形状,示例如下:
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
arr3 = np.array([[1], [2], [3]])
arr4 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr1.shape) # (3,)
print(arr2.shape) # (2, 3)
print(arr3.shape) # (3, 1)
print(arr4.shape) # (2, 2)
根据结果可知,所谓数组的形状,就是指每一维元素的个数。以 arr2 为例,这是一个二维数组,它的第一维度(行)的元素个数为 2,第二维度(列)的元素个数为 3,所以结果就是 (2, 3) 。
访问 Numpy 的 dtype 属性可以获得数组的类型,示例如下:
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([1, 2, 3.2])
arr3 = np.array(['a', 5.0, 3])
arr4 = np.array([['a', 'b'], [5, 6]])
print(arr1.dtype) # int32
print(arr2.dtype) # float64
print(arr3.dtype) # <U3
print(arr4.dtype) # <U1
根据结果可知,当数组中只有整数和浮点数时,Numpy 会将整数全部转为浮点数 。当数组中存在字符串时,Numpy 会将所有元素全部转为字符串。其中,<U3、<U1 表示的就是字符串。
多维数组的访问
import numpy as np
arr = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print(arr[0]) # [1, 2, 3]
print(arr[1][2]) # 6
print(arr[:, 1]) # [2, 5, 8]
print(arr[1, :]) # [4, 5, 6]
print(arr[:1]) # [[1, 2, 3],
[4, 5, 6]]
print(arr[1:]) # [[4, 5, 6],
[7, 8, 9]]
print(arr[:, :3:2]) # [[1, 3],
[4, 6],
[7, 9]]
对于二维数组 arr 而言,各访问方式的含义如下:
- arr[0] 。访问数组的 第一行。
- arr[1][2] 。访问数组的 第二行,第三列。
- arr[:, 1] 。访问数组的 所有行,第二列。
- arr[1, :] 。访问数组的 第二行,所有列。等价于 arr[1] 。
- arr[:1] 。访问数组的 第 1 行 到 第 2 行。
- arr[1:] 。访问数组的 第 2 行 到 最后一行。
- arr[:, :3:2] 。访问数组的 所有行,第 1 列 到 最后一列,列步长为 2(步长默认为1)。
对于 n 维数组来说,访问方式如下:
arr[第一维度位置, 第二维度位置, 第三维度位置, …, 第n维度位置]
多维数组的形状处理
形状变换
Numpy 有两个较为相近的形状变换方法,分别是 reshape() 和 resize() 。
使用示例及区别如下:
import numpy as np
arr = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print(arr.shape) # (3, 3)
print(arr.reshape(1, 9)) # [[1 2 3 4 5 6 7 8 9]]
print(arr.shape) # (3, 3)
print(arr.resize(1, 9)) # None
print(arr.shape) # (1, 9)
根据结果得出的区别如下表:
是否改变原数组 | 返回值 | |
---|---|---|
reshape() | 否 | 处理之后的新数组 |
resize() | 是 | None |
降维
未完。。。