NumPy是Python里面一个非常著名的科学计算库。
我们知道,在Python里面一切皆对象,这造成了在一些开发中,我们的Python占用内存会灰常灰常大,但是在NumPy里面,我们在NumPy Array中可以直接存储原始数据类型(int float),如图。
import numpy as np
# 创建一个简单的numpy array
a = np.array([1, 2, 3, 4])
# array([1, 2, 3, 4])
a[0], a[1]
# (1, 2)
a[1: -1]
# array([2, 3])
# 查看数组的数据类型 datatype
a.dtype
# dtype('int32')
NumPy也支持多维数组
A = np.array([
[1, 2, 3],
[4, 5, 6]
])
A.shape
# (2, 3)
# 查看数组的维度 dimension
A.ndim
# 2
A.size
# 6
B = np.array([
[
[12, 11, 10],
[9, 8, 7],
],
[
[6, 5, 4],
[3, 2, 1]
]
])
'''
array([[[12, 11, 10],
[ 9, 8, 7]],
[[ 6, 5, 4],
[ 3, 2, 1]]])
'''
B.shape
# (2, 2, 3)
# 查看数组的维度 dimension
B.ndim
# 3
B.size
# 12
注意,如果定义numpy array的时候维度不匹配,就会出现这种情况
C = np.array([
[
[12, 11, 10],
[9, 8, 7],
],
[
[6, 5, 4],
]
])
C.dtype
# dtype('O')
C.ndim
# 1
C.shape
# (2,)
用索引定位元素
A = np.array([
# 0 1 2
[1, 2, 3], # 0
[4, 5, 6], # 1
[7, 8, 9] # 2
])
A[1]
# array([4, 5, 6])
A[1][0]
# 4
A[1, 0]
# 4
A[0:2]
'''
array([[1, 2, 3],
[4, 5, 6]])
'''
A[:, :2]
'''
array([[1, 2],
[4, 5],
[7, 8]])
'''
A[1] = np.array([10, 10, 10])
'''
array([[ 1, 2, 3],
[10, 10, 10],
[ 7, 8, 9]])
'''
基本科学计算
a = np.array([1, 2, 3, 4])
a.sum()
# 10
a.mean()
# 2.5
a.std()
# 标准差 standard 1.118033988749895
a.var()
# 方差 variance 1.25
A = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
A.sum(axis=0)
# array([12, 15, 18])
A.sum(axis=1)
# array([ 6, 15, 24])
对于多维array,只需要记住axis=0是对每一列操作,axis=1是对每一行操作
对于多维array,只需要记住axis=0是对每一列操作,axis=1是对每一行操作
对于多维array,只需要记住axis=0是对每一列操作,axis=1是对每一行操作
广播机制
a = np.arange(4)
# array([0, 1, 2, 3])
a + 10
# array([10, 11, 12, 13])
当我们执行a+10的时候,10会被python广播成和a一样维度的向量(10,10,10,10)然后直接与a相加,乘法也是类似的,这种机制使得NumPy的运算效率比纯Python的for循环高许多。
Mask
a = np.arange(4)
# array([0, 1, 2, 3])
a[[True, False, False, True]]
# array([0, 3])
a >= 2
# array([False, False, True, True])
a[a >= 2]
# array([2, 3])
a[a > a.mean()]
# array([2, 3])
通过逻辑运算符我们可以做出一个mask,通过对mask的定位我们可以精准筛选出我们需要的值,这在异常值处理,缺失值处理中有着很重要的作用。