机器学习——Numpy的基本使用

numpy(Numerical Python)是高性能科学计算和数据分析的基础包,它提供了python对多维数组对象的支持:ndarray,具有矢量运算能力,快速、节省空间。numpy支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

ndarray的创建和基本使用

ndarray的创建使用numpy的array函数

import numpy as np

temp = np.array([1,2,3,4])
print(type(temp))
# <class 'numpy.ndarray'>

可以看到输出的结果是<class 'numpy.ndarray'>,ndarray的读取和python的list使用基本一致

import numpy as np

temp = np.array([1,2,3,4])
print(temp[0]) # 1
print(temp[:2]) # [1,2] 类型仍然是ndarray

for item in temp:
    print(item, end=' ')
# 1 2 3 4

但是ndarray还是有一些和python的list不一样的地方
1. Python List元素可以任意类型组合、ndarray元素类型必须相同(不相同时Numpy会自动做类型转换)
1. ndarray有mean()、std()等更多的跟数学计算相关的内置函数
1. ndarray可以更方便的对多维度数组进行运算

import numpy as np

nd1 = np.array([1,2,3,4]) # 全是数字
print(nd1) # [1 2 3 4]

nd2 = np.array([1,'2',3,4]) # 其中包含一个字符串
print(nd2) # ['1' '2' '3' '4']

# ndarray中包含很多数学计算函数
print(nd1.mean()) # 计算平均值
print(nd1.std()) # 计算标准差
print(nd1.max()) # 计算最大值
print(nd1.min()) # 计算最小值
# ...

向量运算

向量和标量的概念这里不详细讲解,这时线性代数里面的概念,在本文中你可以把向量理解为一个ndarray对象,而标量你可以理解为一个number值

  1. 向量与标量的运算
    向量与标量的运算的运算过程就是把向量内的每一个值和标量做相应的运算,可以做的运算有+,-,*,/,&,|,>,<,>=,<=,==。若向量中的类型不一致时会做相应的转换。
import numpy as np

nd1 = np.array([1,2,3,4])
x = 3 # 标量

# 基本算术运算
print(nd1 + x) # [4 5 6 7]
print(nd1 - x) # [-2 -1  0  1]
print(nd1 * x) # [ 3  6  9 12]
print(nd1 / x) # [0.33333333 0.66666667 1.         1.33333333]

# 位运算
print(nd1 & x) # [1 2 3 0]
print(nd1 | x) # [3 3 3 7]

# 逻辑运算
print(nd1 > x) # [False False False  True]
print(nd1 < x) # [ True  True False False]
print(nd1 == x) # [False False  True False]
  1. 向量与向量的运算
nd1 = np.array([1,2,3,4])
nd2 = np.array([1,1,1,1])
nd3 = np.array([True,True,False,True])
nd4 = np.array([False,False,False,False])

# 基本算术运算
print(nd1 + nd2) # [2 3 4 5]
print(nd1 - nd2) # [0 1 2 3]
print(nd1 * nd2) # [1 2 3 4]
print(nd1 / nd2) # [1. 2. 3. 4.]

# 位运算
print(nd1 & nd2) # [1 0 1 0]
print(nd1 | nd2) # [1 3 3 5]
print(~nd1) # [-2 -3 -4 -5]
# bool型的运算
print(nd3 & nd4) # [False False False False]
print(nd3 | nd4) # [ True  True False  True]
print(~nd3) # [False False  True False]

# 逻辑运算
print(nd1 > nd2) # [False  True  True  True]
print(nd1 < nd2) # [False False False False]
print(nd1 == nd2) # [ True False False False]

索引数组

在对ndarray取值的时候,中括号内的变量可以是另一个ndarray,这个ndarray里面全是bool的值,当中括号内的值为True时,被取值的ndarray对应的该项会保留,当为False时,被取值的ndarray对应的该项会被移除,最后返回一个新的ndarray

import numpy as np

nd1 = np.array([1,2,3,4,5])
index = np.array([True,True,False,False,False])
print(nd1[index]) # [1,2]

上文中提到,ndarray和数字进行逻辑运算可以得到一个全是bool型的新的ndarray,所以索引数组还可以用于数组内容的过滤

import numpy as np

nd1 = np.array([1,2,3,4,5])
print(nd1[nd1>3]) # [4 5]

原地操作与非原地操作

与python本身的list类型不同,python的对于list的所有操作都会生成一个新的list进行操作,但是ndarray的某些操作会在原来的list上进行操作

import numpy as np

nd1 = np.array([1,2,3,4,5])
nd2 = nd1
nd1 = nd1 + 3
print(nd2) # [4 5 6 7 8]

nd1 = np.array([1,2,3,4,5])
nd2 = nd1
nd1 += 3
print(nd2) # [4 5 6 7 8]

nd3 = nd2[:2]
nd3[0] = 7
print(nd1) # [7 5 6 7 8]

随机数

文档

random.rand()
根据给定维度生成[0,1)之间的数据

random.randn()
根据给定维度(不给维度时为单个数),产生符合标准正态分布的随机数

random.normal()
产生可定义均值和标准差的正态分布随机数

random.randint()
返回给定维度的随机整数

random.random()、random.random_sample()
返回给定维度的[0, 1)之间的随机数

random.choice()
从给定的一维数组中生成随机数

random.seed()
当设置相同的seed,每次生成的随机数相同。如果不设置seed,则每次会生成不同的随机数

二维数组

numpy的多维数组其实就是一个每一个元素都是一个一维数组的ndarray

import numpy as np

nd = np.array([[1, 2, 3, 4],
               [5, 6, 7, 8],
               [9, 10, 11, 12],
               [13, 14, 15, 16]])
# 取行
print(nd[0]) # 取第1行
print(nd[:2]) # 取前2行
print(nd[1:2]) 取第2行

# 取列
print(nd[:,0]) # 取第1列
print(nd[:,:2]) # 取前2列
print(nd[:,1:2]) # 取第2列

# 行列同时取
print(nd[0,0]) # 取第1行第1个元素
print(nd[:2,:2]) # 取前2行的前2个元素
print(nd[1:2,1:3]) # 取第2行的第2,3个元素

# 求均值,最值,标准差
# 对所有元素
print(nd.mean())
print(nd.max())
print(nd.min())
print(nd.std())
# 对每一行
print(nd.mean(axis=1))
print(nd.max(axis=1))
print(nd.min(axis=1))
print(nd.std(axis=1))
# 对每一列
print(nd.mean(axis=0))
print(nd.max(axis=0))
print(nd.min(axis=0))
print(nd.std(axis=0))
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注