目录
科学计数库Numpy
数据:
通常是一个矩形(每一行表示一个样本,每一列表示,每一列表示当前数据的一个指标)对矩阵的处理,numpy库是专业的!使用之前,需要装numpy库(pip install numpy), Anaconda默认装过了。
读数据:
读txt文件,如图所示:数据与notebook放在一起时,可以直接写文件名,(我没有放在一起,用绝对路径)
import numpy
zc = numpy.genfromtxt("E:\Scores\data.txt", delimiter=",", dtype=str)
# 参数1:文件路径,2:文件中数据的分隔符,3:输出的类型
print(type(zc)) # 变量的结构(ndarray numpy中最核心的结构)
print(zc) # 一个矩阵
print(help(numpy.genfromtxt))# 打印genfromtxt函数的帮助文档
在notebook中运行的结果如下:
当对某个函数不熟悉是,可以用 help()返回它的官方文档,不需要再点开官网看了,比较方便吧
#The numpy.array() 可以将一个列表输出成一维向量 列表的列表输出为矩阵(即上面说的ndarray)
vector = numpy.array([5,10,15,20])#一维向量(当然也是矩阵)
# 矩阵
matrix = numpy.array([[5,10,15],[20,25,30],[35,40,45]])
print(vector)
print(matrix)
print(vector.shape)
# 输出矩阵维度
print(matrix.shape)
维度:
.shape : 在后面找debug的时候会有用,可以通过打印所有变量的shape,看哪里出现了问题(看到这儿我也不是很清楚到底可以怎么样,这里先留有一个印象吧!)
Numpy基础结构
numpy.array()
用.array()构造矩阵时,!列表中的元素的类型必须相同!
num1 = numpy.array([1,2,3,4])
num2 = numpy.array([1,2,3,4.0])
num3 = numpy.array([1,2,3,'4'])
print(num1)
print(num1.dtype)
print(num2)
print(num2.dtype)
print(num3)
num3.dtype
取值与切片
注意去矩阵列的语法[:,0:2] 第一个冒号左边代表(所有)行,逗号后面:要取的列
# 取值按照行列取即可
print(vector[2])
print(matrix[2][1])
# 切片与字符串相同
print(vector[0:3]) # 取0,1,2
print(matrix[:,1]) # 取所有行的第2列
print(matrix[:,0:2])# 取所有行的第0列和第1列
判断操作
# 找矩阵中有没有值等于一个数
print(vector == 10)
matrix == 25
bool类型也可以当索引
布尔值做索引时,TRUE返回对应的值
equal_to_ten = (vector == 10)
print(equal_to_ten)
# equal_to_ten作为索引
print(vector[equal_to_ten])
# 对矩阵同理
second_col_25 = (matrix[:,1] == 25)
print(second_col_25)
# 输出有25的那一行
print(matrix[second_col_25,:])
Numpy矩阵基础
与、或判断
# 一个值既等于10又等于5
equal_to_ten_and_five = (vector == 10) & (vector == 5)
print(equal_to_ten_and_five)
# 一个值等于10或等于5
equal_to_ten_or_five = (vector == 10) | (vector == 5)
print(equal_to_ten_or_five)
改变所有值的类型
vec = numpy.array(["1", "2", "3"])
print(vec.dtype)
print(vec)
# 将所有值改为float类型
vec = vec.astype(float)
print(vec.dtype)
print(vec)
求极值
vector = numpy.array([5,10,15,20])
print(vector.min())# 输出最小的值
matrix = numpy.array([[5,10,15],[20,25,30],[35,40,45]])
# 对每一行求和
print(matrix.sum(axis=1))
# 对每一列求和
print(matrix.sum(axis=0))
Numpy常用函数
查看矩阵的各种属性
import numpy as np # numpy起一个别名np
# 0~14组成的向量
m = np.arange(15)
print(m)
m = m.reshape(3, 5) # 变成3*5的矩阵
print(m)
# m的形状
print(m.shape)
# m的维度
print(m.ndim)
# m中的数据类型
print(m.dtype.name)
# m中元素个数
print(m.size)
初始化
# 注意zeros()中需是一个元祖
print(np.zeros((3,4)))# 默认float类型
# 三维矩阵(每个元素都是整数1)
print(np.ones((2,3,4), dtype=np.int32))
print(np.arange(10,30,5)) # 10开始<30结束,每5个取一个值
# 默认从-1到1产生随机数
print(np.random.random((2,3)))
from numpy import pi
# 起始0到2*pi平均取100个值
np.linspace(0, 2*pi, 100)
数学运算
a = np.array([20,30,40,50])
b = np.arange(4)
print(a)
print(b)
# a-b
c = a-b
# c-1
print(c)
c = c - 1
print(c)
# b**2
print(b**2)
# a<35
print(a<35)
A = np.array([[1,1],
[0,1]])
B = np.array([[2,0],
[3,4]])
print(A)
print("-----------")
print(B)
print("-----------")
# A*b相当于对应位置相乘
print(A*B)
print("-----------")
# A.b相当于矩阵相乘
print(A.dot(B))
print("-----------")
print(np.dot(A,B))# 与上面等价
矩阵常用操作
开方,求e^x
import numpy as np
B = np.arange(3)
print(B)
# 求幂
print(np.exp(B))
# 开方
print(np.sqrt(B))
向下取整、变形、转置
a = np.floor(10*np.random.random((3,4)))# 想下取整
print(a)
print("--------------------------------")
# 把矩阵拉成一个向量
print(a.ravel())
print("--------------------------------")
a.shape = (6,2)
# a.reshape(3,-1) 当行或列确定后,另一个可以置为-1,它自己会算出正确结果
print(a)
print("--------------------------------")
# 转置
print(a.T)
拼接
import numpy as np
a = np.floor(10*np.random.random((2,2)))
b = np.floor(10*np.random.random((2,2)))
print(a)
print("--------------------")
print(b)
print("--------------------")
# 横着拼接
print(np.hstack((a,b)))
print("--------------------")
# 纵着拼接
print(np.vstack((a,b)))
切分
a = np.floor(10*np.random.random((2,12)))
print(a)
print("--------------")
# 按行切分 ,切成3份
print(np.hsplit(a,3))
print("--------------")
# 指定位置切分
print(np.hsplit(a,(3,4)))
b = a.T
print(b)
print("--------------")
# 按列切
np.vsplit(b,3)
------------------>
不同复制操作对比
方法一(起名字)
a = np.arange(12)
# a和b指向同一个东西(只是名字不同)
b = a
print(b is a)
b.shape = 3,4
print(a.shape)
print(id(a))# 对应内存上唯一的一个区域
print(id(b))
方法二(浅复制)
# a和c指向不同的东西,但他们共用值
c = a.view()
print(c is a)
c.shape = 2,6
print(a.shape)
c[0,4] = 1234# 所以c中某个值变了,a中对应的位置值也会变
print(a)
print(id(a))
print(id(c))
方法三 (深复制)
d = a.copy()
print(d is a)
d[0,0]=999
print(d)
print(a)
索引、扩展、排序
索引
import numpy as np
data = np.sin(np.arange(20).reshape(5,4))
print(data)
# 返回每一列最大值的位置(即索引即其所在行)
ind = data.argmax(axis=0)
print(ind)
# 通过ind 取出对应的最大值
data_max = data[ind, range(data.shape[1])]
print(data_max)
扩展
a = np.arange(0, 40, 10)
print(a)
# 扩展a(扩展两行三列)
b = np.tile(a, (2,3))
print(b)
排序
a = np.array([[4, 3, 5,],
[1, 2, 1]])
print(a)
print("--------------------")
# 按行排序(每行从小到大排)
b = np.sort(a,axis=1)
print(b)
print("--------------------")
a.sort(axis=1)
print(a)
print("--------------------")
a = np.array([4, 3, 1, 2])
# 返回从小到大数据对应的索引
j = np.argsort(a)
print(j)
print("--------------------")
print(a[j])# 通过索引取出值
其他
除了上面这些,其他的以后用到了再学习吧!(2021/10/18)