文章目录

  • numpy
  • numpy 创建数组(矩阵)
  • 数组的形状
  • numpy读取本地数据和索引
  • 读取数据
  • numpy的四种转置方式
  • numpy的索引和切片
  • numpy中数值的修改
  • 数组的拼接
  • 数组的行列交换
  • numpy的注意点
  • numpy中的nan和inf
  • numpy中nan的注意点
  • numpy中常用统计函数




numpy

帮助处理数值型数据,是python科学计算库的基础库 import numpy as np

numpy 创建数组(矩阵)

<class 'numpy.ndarray'>

  • 以下三种情况相同
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array(range(1,6))
arr3 = np.arange(1, 6)
# [1 2 3 4 5] 注意arange和array区别
  • 数据的类型:
arr4 = np.array(range(1,4), dtype="float")
print(arr4.dtype) # float64
print(arr4.astype("int8").dtype()) # int8

#   i1--->int8
#   float--->float64 
#   略

print(np.round(random.random(), 2)) # 保留两位小数

数组的形状

t1 = np.arange(12)
print(t1.shape) # (12,)
t2 = np.array([[1,2,3],[4,5,6]])
print(t2.shape) # (2, 3)
print(t2.reshape(t2.shape[0]*t2.shape[1],)) # 未知总长度,知道维度,变一维
print(t2.flatten()) # 变一维
t3 = np.arange(24).reshape((2,3,4)) # 改变数组形状,2*3*4
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

numpy的一个广播机制: 数组+数字 是 给数组中每个位置都加这个数
0/0=nan 数字/0=inf(无穷 )
数组相减:按照减数的维度在被减数上减小
广播会在缺失和长度为1的维度上进行



numpy读取本地数据和索引

在numpy中可以理解为方向,使用0,1,2…数字表示,对于三维数组(shape(2,2,3)),有0,1,2轴

计算一个二维数组的平均值,必须指定是哪个方向上的数字平均值

读取数据

  • CSV:Comma-Separated Value 逗号分隔值文件

np.loadtxt(frame,dtype="int",delimiter=None,skiprows=0,usecols=None,unpack=False)

  1. frame:文件、字符串或产生器,可以是.gz或.bz2压缩文件
  2. dtype:数据类型,可选,CSV的字符串以什么数据类型读入数组中,默认np.float
  3. delimiter:分割字符串,默认是任何空格,改为逗号
  4. skiprows:跳过前X行,一般跳过第一行表头
  5. usecols:读取指定的列,索引,元组类型
  6. unpack:如果True,转置,如果False,不变,默认False
numpy的四种转置方式

转置是一种变化,为了更方便的处理数据

方法1:读入的时候转置
t1 = np.loadtxt(file_path,delimiter=",",dtype="int",unpack=True)
方法2:
arr1.transpose()
方法3:
arr1.swapaxes(1,0)
方法4:
arr1.T



numpy的索引和切片

a = array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
# 取一行
a[1] = array([4, 5, 6, 7])
# 取多行
a[1:3] = array([[ 4,  5,  6,  7],
                [ 8,  9, 10, 11]])
# 取一列
a[:,2] = array([ 2,  6, 10])
# 取多列
a[:,2:4] = array([[ 2,  3],
                  [ 6,  7],
                  [10, 11]])
# 加上步长
a[[0,2],:] = 取第0和第2行
a[:,[0,3]] = 取第0和第3列
# 取第3行到第5行,第2列到第4列的结果
a[2:5,1:4]
# 取多个不相邻的点 arr[0][1],arr[2][2]
a[[0,2],[1,2]]

## 数值类型是numpy.int64或32





numpy中数值的修改

# 普通修改
a[:,2:4] = 0

# 条件修改
## 把a中小于10的改成3
a[a<10] = 3
## 三元运算符
a.where(t<10, 0, 10)
## clip
a.clip(10,18) # 小于10的替换为10,大于18的替换为18

####   nan不会被替换,nan是float型的值,要把某个值设为non,需要先转换为float型,再=non    ####





数组的拼接

temp = np.vstack((t1,t2)) # 竖直拼接(vertically)
temp = np.hstack((t1,t2)) # 水平拼接(horizontally)

数组的行列交换

t = array([[12, 13, 14, 15],
           [16, 17, 18, 19],
           [20, 21, 22, 23]])
t[[1,2],:] = t[[2,1],:] # 行交换

array([[12, 13, 14, 15],
       [20, 21, 22, 23],
       [16, 17, 18, 19]])

t[:,[0,2]] = t[:,[2,0]] # 列交换

array([[14, 13, 12, 15],
       [22, 21, 20, 23],
       [18, 17, 16, 19]])

构造一个全为0的数组,且int类型: np.zeros((t.shape[0],1)).astype(int) 构造一个全为1的数组,且int类型: np.ones((t.shape[0],1)).astype(int) 创建一个对角线为1的正方形数组(方阵)np.eye(3)np.count_nonzero(t2)返回数组中不为0的个数

获得每行最大值最小值的位置

np.argmax(t,axis=0)np.argmin(t.axis=1)

python在矩阵运算时怎么保留3位小数 numpy矩阵保留两位小数_python

  • 正态分布:中间高,两头低
  • 均匀分布:在相同的大小范围内出现概率是等可能的

numpy的注意点

  1. a=b 完全不复制,a和b相互影响
  2. a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,互相影响
  3. a = b.copy(),复制,互不影响

numpy中的nan和inf

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

什么时候出现nan:

  1. 当读取文件为float时候,如果有缺失,就会出现nan
  2. 当做了一个不合适的计算(eg:无穷大(inf)减去无穷大)

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

什么时候出现inf(-inf,+inf):

  1. 比如一个数字除以0,(python中会直接报错,numpy中是一个inf或-inf)

numpy中nan的注意点

  1. 两个nan是不相等的 np.nan!=np.nanTrue
  2. np.count_nonzero(t)返回数组中不为0的个数,np.count_nonzero(t!=t)返回数组中nan的个数。
  3. np.isnan(t)数组的值是不是nan,t[np.isnan(t)] = 0把nan全部替换0。
  4. nan和任何值计算都为nan

在一组数据中,单纯把nan替换为0,有影响!!!
替换后,会对平均值大小产生影响,所以应该把缺失的数值替换为均值(中值)或者直接删除有缺失的一行





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(sxis=None)

python在矩阵运算时怎么保留3位小数 numpy矩阵保留两位小数_数组_02

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