python 第一课 numpy学习:
笔记内容主要包含:实用numpy读取txt文件以ndarray的格式输出;实用np.array输出数组、矩阵,以及其shape,dtype;切片,[:]读取矩阵中部分数据;numpy中的“==”,用于取出矩阵中等于特定值的位置的索引,以及该值;numpy中的逻辑运算 & | ;数值类型转换,一些数学函数运算 min(),sum(axis=0/1) ,np.floor(); 矩阵的reshape操作 ; 两个矩阵的简单数学运算 + - ** A*B , A.dot(B) ; A.reval() 矩阵拉成向量,A.shape(2,3)向量拉回矩阵;矩阵的拼接np.hstack(),np.vstack()与切分 np.hsplit(),np.vsplit; 矩阵的复制.view(),.copy() ;矩阵的排序与索引,.sort()。具体代码实现如下:
# python 第一课 numpy学习
import numpy as np
# 使用numpy 打开一个txt数据
# [['name' 'Student ID' 'age' 'Province']
#['Jhon' '1234213' '23' 'Henan']
#['Marry' '3511672' '21' 'Shandong']
#['Snow' '2316751' '26' 'Shanxi']
#['Joe' '3671213' '19' 'Gansu']]
class_name = np.genfromtxt('E:\\python_code_test\\class name.txt',delimiter = ',',dtype = str)
print(type(class_name)) # 输出打开文档的输出类型 ndarray 格式即矩阵形式
print(class_name) # 打印数据
# print(help(np.genfromtxt)) 可以通过打印help函数 查看所调用函数的内部性质。
# ……………………………………………………………………………………………………在numpy中用索引取数据…………………………………………………………………
# 数组从0开始计数 0,1,2…………
Jhon_age = class_name[1,2]
Joe_Province = class_name[4,3]
print(Jhon_age) # 23
print(Joe_Province) # Gansu
#……………………………………………………………………………………………numpy.array………………………………………………………………………………………………………
# numpy.array可以将一list 作为一个向量形式输出即一维,可将a list of lists 以矩阵形式输出即多维
# 传输给numpy.array 的数据必须具有相同的数据类型,相同的结构!!
vector = np.array([1,2,3,4,5]) # 一个中括号 是一维向量
matrix = np.array([[1,2,3,6],[12,13,14,16],[23,24,25,26]]) # 两个中括号是二维矩阵,多个即是多维
print(vector)
print(vector.shape)
print(matrix)
print(matrix.shape) # (3, 4) 三行四列
vector2 = np.array([1,2,3,4.0]) # 输出结果:[1. 2. 3. 4.]
print(vector2)
print(vector.dtype) # 查看当前数据的类型 vector 是int32
print(vector2.dtype) # float64
# ……………………………………………………………………………………切片………………………………………………………………………………………………………………………………………………
print(vector[0:3]) # 左闭右开 结果:[1 2 3]
print(matrix[:,1]) # 取其中的某一列 $ [2 13 14]
print(matrix[:,0:2]) # 取两列 $ [[ 1 2],[12 13],[23 24]]
print(matrix[0:2,1:2]) # 取某些行某些列 $ [[ 2],[13]]
# ……………………………………………………………………………………在numpy中进行一些计算…………………………………………………………………
# 神器的 “==”
print(vector == 2) # vector 向量中 值等于2 的返回Ture else False $ : [False True False False False]
print(matrix !=14) # $ :[[ True True True True],[ True True False True],[ True True True True]]
equal_to_two = (vector == 2) # 输出vector中值为2的数 ,输出结果为布尔类型
print(equal_to_two)
print(vector[equal_to_two]) # 可将这个布尔值当成一个索引,返回值为True对应的数 。
equal_to_14 = (matrix[:,2] ==14) # 将某列值为14的行置为true
print(matrix[equal_to_14,:]) # 返回值为14 的数所在行的所有数值。
# ……………………………………………………………………………………在numpy中一些取判断的操作…………………………………………………………………
v = np.array([5,10,15,20,25])
equal_to_10_and_20 = (v==10) & (v==20)
print(equal_to_10_and_20) # [False False False False False]
equal_to_10_or_20 = (v==10) | (v==20)
print(equal_to_10_or_20) # [False True False True False]
m = np.array([[5,10,15],[20,25,30],[35,40,45]])
second_column_25 = m[:,1] ==25
print(second_column_25) #[False True False]
m[second_column_25,1] =10 # 替换 把25换成10
print(m)
# ……………………………………………………………………………………在numpy中值类型的转换…………………………………………………………………
vs = np.array(["1","2","3"]) # <U1 ['1' '2' '3']
vs = vs.astype(float) # float64 [1. 2. 3.]
print(vs.dtype)
print(vs)
print(vs.min()) # 打印最小值 1.0
ms = np.array([[5,10,15],[20,25,30],[35,40,45]])
print(ms.min()) # 5
print(ms.sum(axis=1)) # 按行求和 [ 30 75 120] axis表示维度
print(ms.sum(axis=0)) #按列求和 [60 75 90]
#…………………………………………………………………………………创造矩阵……………………………………………………………………………………………………………
# np.arange()
print(np.arange(15)) # 向量 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
a=np.arange(15).reshape(3,5) # 矩阵 [[ 0 1 2 3 4],[ 5 6 7 8 9],[10 11 12 13 14]]
a.shape # (3, 5)
a.ndim # 维度 2
a.dtype.name # 矩阵中的值的类型 int32
a.size # 值的个数 15
# zeros ones
# 用0初始化一个三行四列的矩阵 采用元组的形式 需要用()括起来
zeros = np.zeros((3,4)) # 构造值全是0的矩阵
ones = np.ones((2,3,4),dtype = np.int32) # 构造值全是1的矩阵
print(zeros) # [[0. 0. 0. 0.] , [0. 0. 0. 0.] ,[0. 0. 0. 0.]]
print(ones)
"""
[[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]]
"""
# 构造从x 开始 到小于 y 结束 每隔 s 个以添加
b = np.arange(10,30,5) # [10 15 20 25]
c = np.arange(0,2,0.3) # [0. 0.3 0.6 0.9 1.2 1.5 1.8]
# 随机模块 random
np.random.random((2,3)) # 随机产生 一个2行3列的矩阵
# linspace 且可对其产生的值做一系列的操作 如求sin min max sum
import math
np.linspace(0,2*math.pi,100) # 从0开始 2π为终点 生成100个数 数与数之间的间隔相等
from numpy import pi
np.linspace(0,pi,5) # array([0. , 0.78539816, 1.57079633, 2.35619449, 3.14159265])
np.linspace(0,10,5) # array([ 0. , 2.5, 5. , 7.5, 10. ])
np.sin(np.linspace(0,10,5) ) # 求sin array([ 0. , 0.59847214, -0.95892427, 0.93799998, -0.54402111])
#…………………………………………………………………………………np.arange 进行一系列数学运算……………………………………………………………………………………………………………
d = np.array([10,20,30,40])
f = np.arange(4) # array([0, 1, 2, 3])
g = d - f # 对应位置相减 array([10, 19, 28, 37])
g2 = d + f
print (g-1) # 每个位置减1 [ 9 18 27 36]
print(f**2) # 求平方 [0 1 4 9]
print(d>20) # 判断 [False False True True]
# 矩阵乘法
A = np.array([[1,2],
[0, 1]])
B = np.arange(4).reshape(2,2)
# [[0 1]
# [2 3]]
print(A*B) # 对应元素相乘
"""
[[0 2]
[0 3]]
"""
print(A.dot(B)) # 做矩阵乘法运算
print(np.dot(A,B)) # 同上
"""
[[4 7]
[2 3]]
"""
# 其他数学运算
C=np.arange(4)
print(C) # [0 1 2 3]
print(np.exp(C))
print(np.sqrt(C)) # 开方 [0. 1. 1.41421356 1.73205081]
D = np.floor(10*np.random.random((3,4))) # floor 向下取整
print(D)
"""
[[0. 5. 3. 4.]
[8. 5. 4. 3.]
[1. 1. 6. 5.]]
"""
print(D.ravel()) # 从矩阵拉成向量 [9. 2. 9. 3. 7. 4. 3. 1. 6. 8. 2. 0.]
D.shape =(2,6) # 再次变换成 2行6列
print(D)
"""
[[1. 9. 0. 7. 4. 4.]
[4. 1. 8. 3. 3. 7.]]
"""
print(D.T) # 求转置
print(D.reshape(4,-1)) # 当 行数确定后 列数也就确定了 可用-1表示已确定的列数
#…………………………………………………………………………………矩阵的拼接……………………………………………………………………………………………………………
D1 = np.floor(10*np.random.random((2,2)))
D2 = np.floor(10*np.random.random((2,2)))
print(D1)
print(D2)
print(np.hstack((D1,D2))) # h stack 横着拼接
print(np.vstack((D1,D2))) # v-stack 纵着拼接
"""
[[4. 2.]
[2. 5.]]
[[9. 6.]
[5. 0.]]
h-stack [[4. 2. 9. 6.]
[2. 5. 5. 0.]]
v-stack [[8. 5.]
[0. 3.]
[1. 1.]
[7. 9.]]
"""
#…………………………………………………………………………………矩阵的切分……………………………………………………………………………………………………………
D3 = np.floor(10*np.random.random((2,12)))
print(D3)
print(np.hsplit(D3,3)) # hsplit 按行进行切分 将2行12列的矩阵拆分成3个 2行4列 的矩阵
print(np.hsplit(D3,(3,4))) # 指定位置切分 0 1 2/3/4 5 6 7 ……
D3 = np.floor(10*np.random.random((12,2)))
print(np.vsplit(D3,3)) # vsplit 按列进行切分 将12行2列的矩阵拆分成3个4行2列的矩阵
#…………………………………………………………………………………复制……………………………………………………………………………………………………………
# b = a时 a,b是相同的内容只是名字不一样,具有相同的ID b发生变化时,a也会发生变化
a = np.arange(12)
b = a
print(a is b) # True
b.shape=(2,6)
print(a.shape) # (2, 6)
print(id(a)) # 164022192
print(id(b)) # 164022192
# .view 浅复制
# a,c 的ID指向位置不一样,但是他们公用一套值,c的数值发生改变 a 也会发生改变
c = a.view()
print(a is c) # False
c.shape=(3,4)
print(a.shape) # (2, 6)
c[2,3]=1234
print(a) # [[ 0 1 2 3 4 5] , [ 6 7 8 9 10 1234]]
print(id(a)) # 164022192
print(id(c)) # 163945968
# .copy 深复制
# a,d 具有不同的ID 且数值之间没有影响
d = a.copy()
print(a is d) # False
d[0,0]=520
print(d) # [[ 520 1 2 3 4 5] ,[ 6 7 8 9 10 1234]]
print(a) # [[ 0 1 2 3 4 5], [ 6 7 8 9 10 1234]]
print(id(a)) # 164022192
print(id(d)) # 164022272
#…………………………………………………………………………………排序 索引………………………………………………………………………………………
# .argmax()
# 通过索引的方式找到矩阵中每一列的最大值。
import numpy as np
data = np.sin(np.arange(20)).reshape(5,4)
ind = data.argmax(axis=0) # axis=0 找到每一列的最大值的索引
data_max = data [ind,range(data.shape[1])] # 找到最大的值是多少
print(data)
print(ind)
print(data_max)
# tile
# ndarray的格式进行扩展
q = np.arange(0,40,10)
print(q) # [ 0 10 20 30]
print(q.shape) # (4,)
b = np.tile(q,(2,2))
print(b) # [[ 0 10 20 30 0 10 20 30],[ 0 10 20 30 0 10 20 30]]
print(b.shape) # (2, 8)
# 排序 np.sort()不改变原矩阵值,.sort()改变了原矩阵值
# np.argsort()输出了从小到大的索引
p = np.array([[3,7,1],[6,4,3]])
c = np.sort(p,axis=1) # 每一行的元素从大到小排列。
print(c) # [[1 3 7],[3 4 6]]
print(p) # [[3 7 1],[6 4 3]]
p.sort(axis=1) # p的值发生改变
print(p) # [[1 3 7],[3 4 6]]
p = np.array([4,3,2,1])
j = np.argsort(p) # 从小到大输出ndarray中元素的索引
print(j) # [3 2 1 0]
print(p[j]) # [1 2 3 4] # 从大到小输出元素