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] # 从大到小输出元素