NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。
NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。
说白了就是MatLab的替代,为了利用Python来完成科学计算任务。线性代数是numpy的数学基础。
可能需要一定的数学知识。
最简单的方式
pip install numpy
如果需要具体的版本需要在后面加上版本号。
我并不建议这样安装。
推荐的方式,anaconda
anaconda下载链接
为什么推荐呢?
原因有一下几个方面。
一句话,用anaconda!!
然后无论你是用pycharm还是vscode都需要切换一下解释器。
具体见我的vscode使用教程。谢谢!!!
numpy官网
numpy源代码
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
参数的话第一个第二个重要,其他的自行百度,一般用不到。
object, 数组或嵌套的数列
dtype,数组元素的数据类型,可选(会自动识别)
所以这里我们就能明白array这个新的数据结构是以list作为根基的。
实际上array也确实是从list继承而来,只不过多了很多向量化运算的接口方法。
dtype作为参数,也就意味着ndarray要求了数据类型的一致性。
import numpy as np # 一般都这么简写
a = np.array([[1, 2], [3, 4]])
print (a)
# 最小维度
import numpy as np
a = np.array([1, 2, 3, 4, 5], ndmin = 2)
print (a)
import numpy as np
a = np.array([1, 2, 3], dtype = complex) # 虚数
print (a)
数据类型的种类都是预制的
常见的几个int8,int64,uint16,float64
全部细节见官网。
int8, int16, int32, int64 四种数据类型可以使用字符串 ‘i1’, ‘i2’,‘i4’,‘i8’ 代替
来点复杂的,但是更常用的
背景是,现在需要建立一个关于学生信息的array,里面要有名字年龄和成绩。
显然我们array里面因该是一个学生的对象,对象包含这三者信息。
但有一个问题,这三个信息数据结构可能是不同的,怎么办呢?
解答是:声明这个数据结构,就像cpp的struct一样。结果如下
import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
print(a)
是不是如出一辙?
不过放心好了,一般处理这样的有意义的数据用到的是pandas,ndarray作为最基础的往往都处理纯粹的向量运算。
也就是说都是整形或者浮点型的n维数组。
常见的初始化,往往是需要等差,等比,随机序列
# 等差数列
# 方法一:numpy.arange([start, ]stop, [step, ]dtype=None, *, like=None)
t3 = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
# 方法二:numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
print(np.linspace(1,5,5,endpoint=True)) # [1. 1.8 2.6 3.4 4.2]
print(np.linspace(1,5,5,endpoint=True)) # [1. 2. 3. 4. 5.] 默认是True也就是左闭右闭
# 一个强调步长,一个强调步数,角度不同。
# 等比数列
# numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0)
print(np.logspace(1,10,10)) # [1.e+01 1.e+02 1.e+03 1.e+04 1.e+05 1.e+06 1.e+07 1.e+08 1.e+09 1.e+10]
# 随机数相关
# np.random.rand() --> 生成指定维度的的[0,1)范围之间的随机数,输入参数为维度
np.random.rand(4,3,2)
# np.random.randn() --> 生成指定维度的服从标准正态分布的随机数,输入参数为维度
np.random.randn(2,4) # 没有参数,只返回单个数据满足正态分布
# np.random.randint(low, high = None, size = None,dtype = 'l') 返回随机数或者随机数组成的array
np.random.randint(1,10,size=5) # [5 8 6 2 9]
# np.random.seed()指定随机数种子,这样同一个种子下的随机数都是相等的,请根据具体场合决定是否使用
# 我的建议是调试的时候用,其他不用
np.random.seed(1)
np.random.rand(1) # array([0.4359949])
np.random.seed(1)
np.random.rand(1) # array([0.4359949])
我想强调一点,尽管整数和浮点数可以放到一起初始化。因为会有一些类型转换。但是千万不要这样做!!!
一定要注意array里面的数据类型一致。不要觉得可以怎么怎么样,就搞骚。。。
比较常用的ndim,shape
import numpy as np
# ndim
a = np.arange(24)
print (a.ndim) # a 现只有一个维度
# 现在调整其大小,注意新的大小要可行且合理,比如这里2x4x3=24合理
b = a.reshape(2,4,3) # b 现在拥有三个维度
print (b.ndim)
# shape
a = np.array([[1,2,3],[4,5,6]])
print (a.shape)
# itemsize
x = np.array([1,2,3,4,5], dtype = np.int8)
print (x.itemsize)
# 数组的 dtype 现在为 float64(八个字节)
y = np.array([1,2,3,4,5], dtype = np.float64)
print (y.itemsize)
# dtype,返回一开始给的类型
print (y.dtype)
# numpy.empty(shape, dtype = float, order = 'C')
# numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组
x = np.empty([3,2], dtype = int)
print (x) # 毫无意义的乱码
# 零矩阵
# 默认为浮点数
x = np.zeros(5)
print(x)
# 设置类型为整数
y = np.zeros((5,), dtype = int)
print(y)
# 自定义类型
z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])
print(z)
#单位矩阵
x = np.ones(5)
print(x)
# 自定义类型
x = np.ones([2,2], dtype = int)
print(x)
这些方法都很少用的到,不过要知道,因为这是线代的一些基础知识。
总的来说numpy就是线代里面的向量。最为基础的自然是一维的。往往用到的也就是一维的和二维的。
那么这些有什么价值呢?线代有什么屁用呢?
当然是很有用的啦!!!
我们对于万事万物的理解都是有限的,比如一个人好坏美丑,也就那么常见的几个点。
如果想要建立模型,那么线代不就是了。而且简单计算维度还不算高
如果更进一步,比如说我想通过一个人的特征判断其他的特征。比如美丑判断品德。
那么我们就可以通过这些建模之后的向量去建立他们之间的回归关系!!!
所以下一讲,我们来看看numpy的运算!!!