numpy
为什么要用numpy科学计算库?
一般情况下数据的组成:
行和列
学号 | 姓名 | 语文成绩 |
---|---|---|
1 | 张三 | 89 |
2 | 李四 | 85 |
3 | 王五 | 100 |
一般数据都是这样组成的,我们可以把数据分为行和列,这样对于数据的运算是很方便的,同时也是和高效的,这就是使用munpy科学计算库的原因,numpy就是做矩阵的计算,且是底部实现是C语言,运算速度很快.
- Numpy是一种数学工具,用于矢量计算
- Numpy的对象称为矩阵/多维数组 轴指的是维度,轶指的是轴的数量
常用属性和方法
numpy对象常用属性
b = np.array([[1,2,3]
,[4,5,6]])
print(b.ndim)
print(b.shape)
print(b.dtype)
print(b.size)
print(b.itemsize)
a = np.array([1,2,3])
print(a.shape)
b = np.array([[1,2,3]
,[4,5,6]])
print(b.shape)
很可能用在debug中,看看在转化中shape是否有错误
ndim
几个维度shape
各个维度的数值dtype
数据类型(int类型默认是32,float默认是64)size
元素总数itemsize
每个元素字节大小arange
(数字)生成一个数字列表reshape(x,y)
把numpy对象转为一个x行y列的对象
numpy打开文件
- numpy.genfromtext(’*.txt’,delimite=’,’,dtype=‘str’)
- 第一个参数表示
txt文件的路径
- 第二个参数表示把这个txt文件的内容按照,分隔
- 第三个参数表示打开文件的方式(如果有float的数据也有stsr的数据,用str的方式打开,在转化float的数据转化)
numpy的创建
第一种方式numpy.array(*)
- 注意
*
可以是一切的序列类型 - dtype自动推断 ,一般是float64(用于数值计算),也可以显式指定
- 另外对于set来说,直接传入时,仅作为一个元素,如果不想作为一个元素,那么可以在传入之前先转化为list或者tuple
其他方式创建
占位符
- np.zeros/ones/empty(*) *代表各维度的元组
- np.zeros_like/ones_like/empty_like(*) *表示参考另一个数组的dtype和shape
- 应用于数组元素未知,但是大小已知,这种方式有着高昂的运算代价,不建议经常使用
np.arange()
相当于python中的range()函数,称为数组数列
Np.eye/identity(),单位矩阵,特点是对角线为1,其余为0
# numpy创建一维二维矩阵
a = np.array([1,2,3])
print(a)
b = np.array([[1,2,3]
,[4,5,6]],dtype='int64')#在创建时可以指定numpy的数据类型
print(b)
注意在numpy创建数组时,内部的序列的类型必须是相同的
#这种事不被允许的
#a = np.array([1,2,3])
#print(a)
a = np.array([1,2,3,4.0],dtype='float')
print(a)
numpy的基本运算
- 元素级运算
- 特点是:矩阵中的每个元素和对应位置的元素进行运算
a = np.array([1,2,3])
a ==2
结果为:a[False,True,Flase]
布尔类型的值可以作为索引的值
a = np.array([1,2,3])
index =(a ==2)
print(index)
矩阵的布尔运算也支持与或非的操作
vector = np.array([5,10,15,20])
equal_to_ten_and_five = (vector = 10) & (vector = 5)
equal_to_ten_or_five = (vector = 10) | (vector = 5)
print(equal_to_ten_and_five)
结果为:[False False False False]
a = np.array([[1,1],
[0,1]])
b = np.array([[2,0],
[3,4]])
print("**********")
print(a)
print("**********")
print(b)
print("**********")
print(a*b)#得到的结果是对应位置相乘的结果
print("**********")
print(a.dot(b))#dot就是说矩阵的乘法
print("**********")
print(np.dot(a,b))#这是矩阵乘法的另一种表达方式
numpy的索引和切片操作
numpy是支持索引和切片操作的.我们把操作做一个分类:
按照对象维度可以分为一维
和多维
一维
- arr[a]
- arr[a:b]
- arr[::-1]
a = np.array([1.0,2.0,3.0,4.0])
result1 = a[1]
print(result1)
result2 =a[1:3]
print(result2)
result3 =a[::-1]
print(result3)
多维
*
b = np.array([[1,2,3]
,[4,5,6]],dtype='int64')
result1 = b[:,1]#索引整个第一列
result2 = b[:0,2]#切片索引0.1列
result3 = b[0:1,0:1]#索引切片取第一行第一列
print(result1)
print(result2)
print(result3)
numpy对对象的类型转换
np.astype(*)
*表示的是数据类型
vector = np.array(["1","2","3"])
vector = vector.astype(float)
print(vector)
numpy的复制
numpy的复制,要求必须是显式的复制.
- 完全不拷贝:函数调用和简单赋值
- 浅复制
含义:不同的数组的对象共享同一数据
创建:新的数组对象指向同一数据
- 完全拷贝:数组和数据 d=a.copy()
random函数的使用
np.random.random((2,3))
2代表行数3代表列数
inspace
数的用法
np.inspace(0,50,100)#从0开始到50结束,平均取100个数作为numpy的对象
矩阵的常用操作:
矩阵格式的控制和变换:
- ravel()函数:把矩阵变换为一维
- a.shape =(6,2)#对numpy的对象进行重新的排列维数
- np.T矩阵的转置
a = np.floor(10*np.random.random((3,4)))
print('_______________')
print(a)
print('_______________')
print(a.ravel())#把矩阵变换为一维
a.shape =(6,2)#对numpy的对象进行重新的排列维数
print('_______________')
print(a)
print('_______________')
print(a.T)#获得a的转置矩阵
b = a.reshape(3,-1)#在numpy的维数变换时,指定行之后,其实列的值也确定了,可以用-1表示
print(b)
矩阵的拼接
- 左右拼接
a = np.floor(10*np.random.random((2,2)))
a = np.floor(10*np.random.random((2,2)))
print('_______*________')
print(a)
print('_______*________')
print(b)
print(np.hstack((a,b)))
- 上下拼接
a = np.floor(10*np.random.random((2,2)))
a = np.floor(10*np.random.random((2,2)))
print('_______*________')
print(a)
print('_______*________')
print(b)
print(np.vstack((a,b)))#纵着拼接
切分
- np.hsplit(a,3)第一个参数表示要切分的对象,第二个参数表示要切分为几份,按行切分
- np.vsplit(b,3)第一个参数表示要切分的对象,第二个参数表示要切分为几份,按列切分
a = np.array(np.random.random((2,12)))
print(a)
print(np.hsplit(a,3))#第一个参数表示要切分的对象,第二个参数表示要切分为几份,按行切分
b = np.array(np.random.random((12,2)))
print(b)
print(np.vsplit(b,3))#第一个参数表示要切分的对象,第二个参数表示要切分为几份,按列切分