NumPy学习笔记

  • NumPy简介
  • NumPy基础
  • 1、创建数组(矩阵)、数据类型
  • 2、数组属性查看:类型、尺寸、形状、维度
  • 3、小数、reshape(括号维度辨析)
  • 4、广播
  • 5、轴概念、数组拼接
  • 5.1轴
  • 5.2拼接
  • 6、三元运算符、行列交换
  • 7、numpy中的nan和inf
  • 7.1 简介
  • 7.2 nan性质
  • NumPy常用方法
  • NumPy生成随机数
  • NumPy中的布尔索引
  • NumPy常用统计方法
  • 思维导图



   

NumPy简介

(用火狐浏览器分级目录的字体是加粗的?)
下文摘自:
        NumPy是python中的一款高性能科学计算与数据分析的基础包,NumPy定义了矩阵和数组,提供存储单一类型的多维数租(ndarray)和矩阵(Matrix)以及相关运算,功能和Matlab中的矩阵运算相似。NumPy常和稀疏矩阵计算包Scipy配合使用,更加方便。
    NumPy是一个运行速度非常快的数学库,主要用于数组计算,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

NumPy基础

1、创建数组(矩阵)、数据类型

# 创建数组:
t = np.array(range(10)) # 效果等于np.arange(10)
# 取步长:
np.arange(4, 10, 2)
# 数据类型:
print(type(t)) #  -->> numpy.ndarray
print(t.dtype) # -->> int64
# 数据类型的操作:
t = np.array(range(1, 4), dtype="float32")
t = np.array([1, 1, 0, 1, 0], dtype="bool")
print(t.dtype)
# 修改数据类型:
t = t.astype("int8")

注:1、很多情况会采用科学计数法,可以转换成float类型
2、NumPy中常见的更多数据类型

2、数组属性查看:类型、尺寸、形状、维度

:

import numpy as np  
  
a1 = np.array([1,2,3,4],dtype=np.complex128)  
print(a1)  
print("数据类型",type(a1))           #打印数组数据类型  
print("数组元素数据类型:",a1.dtype) #打印数组元素数据类型  
print("数组元素总数:",a1.size)      #打印数组尺寸,即数组元素总数  
print("数组形状:",a1.shape)         #打印数组形状  
print("数组的维度数目",a1.ndim)      #打印数组的维度数目

3、小数、reshape(括号维度辨析)

# NumPy中的小数
t7 = np.array([random.random() for i in range(10)])
print(t7)
print(t7.dtype)
# 取2位四舍五入后的数
t8 = np.round(t7, 2)
# P2数组的计算:
t1 = np.arange(12)
t2 = np.array([[1, 2, 3],[4, 5, 6]])
t2.shape # ==>>(2, 3)
t3 = np.array([[1,2,3], [4,5,6]],[[7,8,9],[10, 11,12]])
t3.shape
t4 = np.arage(12)
t4.reshape((3, 4))
t5 = np.arrange(24).reshape((2, 3, 4))
# 这是一种有返回值的方法,说明本身不进行新建内存,直接修改本身
# 只是 reshape() 返回调整维度后的副本,而不改变原 ndarray。
t5.reshape((4,6))
t5.reshape((24,))
t5.reshape((24, 1))
t5.reshape((1, 24))
# 计数
t6 = t5.reshape((t5.shape[0]*t5.shape[1],))
t5.flatten()
  • 为什么上面加两个括号?=> 使用array函数创建时,参数必须是由方括号括起来的列表,而不能使用多个数值作为参数调用array。

4、广播

具体可参考:
https://www.runoob.com/numpy/numpy-broadcast.htmlhttps://blog.csdn.net/abcd4491/article/details/101652034

  • 加减广播机制–数组和数组进行计算
  • 一般来说数组形状不一样不能直接计算
    数据减去数组:
loss_star = np.array([4.36, 5.88, 5.60, 4.80])
loss_end = np.array([1.27, 1.78, 2.07, 2.19])
loss_change = np.array([loss_star - loss_end])

5、轴概念、数组拼接

5.1轴

https://www.zhihu.com/question/58993137/answer/375111564 轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸。
注意看,官方对于0和1的解释是轴,也就是坐标轴。而坐标轴是有方向的,所以千万不要用行和列的思维去想axis,因为行和列是没有方向的,这样想会在遇到不同的例子时感到困惑。
根据官方的说法,1表示横轴,方向从左到右;0表示纵轴,方向从上到下。 当axis=1时,数组的变化是横向的,而体现出来的是列的增加或者减少。
https://www.zhihu.com/question/58993137/answer/294152051 其实是统一的。0:作用对象是index; 1:作用对象是columns。

5.2拼接

# 数组的拼接
# 竖直拼接
np.vstack((t1, t2))
# 水平拼接
np.hstack((t1, t2))

# 数组分割:怎么接的怎么减去:
# 即和vstack相反操作

6、三元运算符、行列交换

# numpy中的三元运算符
t = np.arange(24).reshape((4, 6))
np.where(t<10, 0, 10)
# numpy中的clip(裁剪)
# 可以处理异常数据
t.clip(10 ,18)
# 小于10的替换为10,大于18的替换为18,但nan没有被替换

# 数组的行列交换
t = np.arange(12, 24).reshape(3, 4)
t[[1, 2],  :] = t[[2, 1], :]

7、numpy中的nan和inf

7.1 简介

  • nan(NAN,Nan):not a number表示不是一个数字

什么时候numpy中会出现nan:当我们读取本地的文件为float的时候,如果有缺失,就会出现nan当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)

  • inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷

什么时候回出现inf包括(-inf,+inf)比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)

numpy放到gpu上 numpy gpu_numpy放到gpu上

7.2 nan性质

导读:那么问题来了,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行。

  • 啊1、两个nan是不相等的
  • 2、np.nan!=np.ann
  • 3、利用以上的特性,判断数组中nan的个数
    np.count_nonzero(t!=t)
  • 4、由于2,那么如何判断一个数字是否为nan呢?通过np.isnan(a)来判断,返回bool类型,比如希望把nan替换为0
  • 5、nan和任何值计算都为nan

NumPy常用方法

NumPy生成随机数

noise_size = 0.5
noise_test = (np.random.random((10000,784)).astype(float))% noise_size

numpy放到gpu上 numpy gpu_数组_02

NumPy中的布尔索引

numpy放到gpu上 numpy gpu_数组_03


练习案例:

for i in range(t1.shape[1]):
    temp_col = t1[:, i] # 当前的一列
    nan_num = np.count_nonzero(temp_col != temp_col)
    if nan_num != 0: # 不为0,说明当前这一列中有nan
        temp_not_nan_col = temp_col[temp_col == temp_col] # 当前一列不为nan的array
        # temp_not_nan_col.mean()
        # temp_col[temp_col != temp_col]
        # 选中当前为nan的位置,把值赋值为不为nan
        temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()

t10[:,1]<=15
array([ True,  True,  True, False])

t10[t10[:,1]<=15]
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12],
       [13, 14, 15, 16, 17, 18]])

NumPy常用统计方法

  • 求和:t.sum(axis=None)
  • 均值:t.mean(a,axis=None) 受离群点的影响较大
  • 中值:np.median(t,axis=None)
  • 最大值:t.max(axis=None)
  • 最小值:t.min(axis=None)
  • 极值:np.ptp(t,axis=None) 即最大值和最小值只差
  • 标准差:t.std(axis=None)

默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果

思维导图

总结 
         

           切片和索引 
         

           赋值 
         

           布尔索引 
         

           三元运算符 
         

           裁剪 
         

           转置 
         

           读取本地文件 
         

           nan和inf 
         

           常用的统计函数 
         

           选择行 
         

           选择列 
         

           选择行列 
         

           索引 
         

           t[2:,3]=3 
         

           t[t>10]=10 
         

           np.where(t>10,20,0) 
         

           t.clip(10,20) 
         

           t.T 
         

           t.transpose() 
         

           t.swapaxes(1,0) 
         

           np.loadtxt(file_path, delimiter, dtype) 
         

           inf 
         

           nan 
         

           t.sunm(axis=0) 
         

           np.mediant(t,axis=0) 
         

           t.mean(axis=0) 
         

           t.max() 
         

           t.mean() 
         

           np.ptp计算极差 
         

           t.std 
         

           t[2] 
         

           t[3:, :] 
         

           t[:,4:] 
         

           连续的多行 
         

           不连续 
         

           把t中大于10的替换为20,其他的替换为0 
         

           把小于10的替换为10,大于20的替换为20 
         

           表示无穷 
         

           不是一个数字 
         

           np.mam!=np.nan 
         

           np.count_nonzero(na.nan!=nan) 
         

           np.isnan(t1) 
         

           标准差反应数据的离散程度 
         

           t[2:,:3] 
         

           t[[1,3],[2,4]] 
         

           t[2,3] 
         

           效果和np.nan!=np.nan相同 
         

           选择的是两个位置值:12,34