numpy学习笔记

numpy学习笔记

文章目录

  • numpy学习笔记
    • 前言:
      • 什么是 NumPy?
      • 为何使用 NumPy?
    • numpy基础
        • 创建 NumPy ndarray 对象
          • 生成数组
          • 多维数组
          • 数据类型
          • 随机数
          • 数组转置
          • 数组过滤filtering
          • 迭代数组
        • 数组索引
        • 数据切片
        • 数组赋值
        • 数组拼接Joining
        • 数组拆分Spliting
        • 数组计算
          • NumPy 数学函数
          • NumPy 算术函数
        • 数组查找
        • 数组排序
        • 读取本地文件
        • nan和inf
        • copy和view
    • numpy常用统计方法

前言:

numpy库的用途实在太广了,最近研究生新生开学,准备做一个新生的大数据分析,所以学习一下数据分析。在此总结学习笔记。

本教程大体上按照学习数据结构的方式,按照增删改查的顺序编写,以便自己复习时用,以后用到再补充。本目录格式,与思维导图保持一致,修改文档记得同步思维导图!

什么是 NumPy?

一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算。

为何使用 NumPy?

快速,方便,科学计算的基础库

numpy基础

NumPy 用于处理数组。 NumPy 中的数组对象称为 ndarray。我们可以使用 array() 函数创建一个 NumPy ndarray 对象。

创建 NumPy ndarray 对象

生成数组

创建一个指定数组

t1 = np.array([1,2,3])

快速生成指定数组

arr = np.array(range(10))#快速生成0-9的数组
arr =np.arange(10)#快速生成0-9的数组
a = np.arange(10,20,2)#10-20 步长为2
a = np.arange(12).reshape((3,4))#0-11调整数组大小3行4列
a = np.linspace(1,10,6).reshape((2,3))#从1-10平均分6段

生成随机小数

arr = np.array([random.random() for i in range(10)])#利用random生成numpy中的小数

保留小数位

t8 = np.round(t7,2)#保留2位小数
多维数组

创建一个指定的二维数组

array = np.array([[1,2,3],[2,3,4]])

创建一个指定的三维数组

t3 =np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])

查看数组的形状

print(t3.shape)#查看数组的形状

检查数组的维数

print(a.ndim) #检查数组的维数

修改数组形状

t4 = t2.reshape(3,2)#修改数组形状

查看元素个数

print('size',array.size)#元素个数

展开数组

newarr = arr.flatten()#展开数组,二维变一维
newarr = arr.reshape(-1)#展开数组,二维变一维

创建指定维数的数组

arr = np.array([1, 2, 3, 4], ndmin=5)#创建一个有 5 个维度的数组
数据类型
print(t4.dtype)#检查数组的数据类型
arr = np.array(range(1,4),dtype="float32")#numpy中的数据类型
arr = np.array([1,1,0,1,0,0],dtype=bool)#numpy中的bool类型
t6 = t5.astype("int8")#调整数据类型

ValueError:在 Python 中,如果传递给函数的参数的类型是非预期或错误的,则会引发 ValueError。
转换已有数组的数据类型

newarr = arr.astype('i')#复制新数组并转换为int
随机数

随机数并不意味着每次都有不同的数字。随机意味着无法在逻辑上预测的事物。

生成随机整数

from numpy import random

x = random.randint(100)#0-100之间的随机整数

x=random.randint(100, size=(5))#生成一个 1-D 数组,其中包含 5 个从 0 到 100 之间的随机整数

x = random.randint(100, size=(3, 5))#生成有 3 行的 2-D 数组,每行包含 5 个从 0 到 100 之间的随机整数

生成随机浮点数

x = random.rand()#0-1之间随机浮点数

x = random.rand(5)#生成包含 5 个随机浮点数的 1-D 数组

x = random.rand(3, 5)#生成有 3 行的 2-D 数组,每行包含 5 个随机数

从数组生成随机数

x = random.choice([3, 5, 7, 9])#返回数组中的值之一

.seed(s)#随机数种子

数组转置
t.T
t.transpose()
t.swapaxes(1,0)数组索引
数组过滤filtering
arr = np.array([61, 62, 63, 64, 65])  x = [True, False, True, False, True] newarr = arr[x] #过滤掉false的元素
arr = np.array([61, 62, 63, 64, 65]) filter_arr = arr > 62 newarr = arr[filter_arr]#直接从数组创建过滤器
迭代数组
for x in np.nditer(arr):  print(x)#迭代输出数组的每一个值
for x in np.nditer(arr, flags=['buffered'], op_dtypes=['S'])#以字符串形式遍历数组
for x in np.nditer(arr[:, ::2]):#每遍历 2D 数组的一个标量元素,跳过 1 个元素
for idx, x in np.ndenumerate(arr):  print(idx, x)#枚举以下 1D 数组元素(带索引迭代)
A = np.arange(3,15).reshape(3,4)
for row in A:
	print(row)#迭代每一行,按行输出
for column in A.T:
	print(column)#迭代每一列。用.T转置 行变列

数组索引

访问 1-D 数组

print(arr[0])#访问第一个元素
print(arr[1])#访问第二个元素

访问 2-D 数组

t[2,3]#访问3行4列元素

访问 3-D 数组

print(arr[0, 1, 2])#访问第一个数组的第二个数组的第三个元素

布尔索引

t[t>10]=10 

数据切片

选择行

t[2]#第二行
t[2:]#第二行及以后
t[3:,:]第三行及以后

选择列

t[:,4:]

选择行列

连续的多行

t[2:,:3]#3行后,3列前
b = t2[2:5,1:4]#取多行和多列,取第三行到第五行,第二列到第四列的结果

不连续

c = t2[[0,2,2],[0,1,3]] # 00  21 23
t[[1,3],[2,4]]#选择的是(1,2)(3,4)两个位置的值

STEP裁剪步长

print(arr[1:5:2])从索引 1 到索引 5,返回相隔的元素

数组赋值

按位置赋值

t[2:,3]=3

裁剪

t.clip(10,20)#把小于10的替换为10,大于20的替换为20
t3 = t2<10 #自动转换成bool 符合true 不符合false
t2[t2<10]=3 #把小于10的都赋值为3
t4= t2[t2>20]#取大于20的数

三元运算符

np.where(t>10,20,0)#把t中大于10的替换为20,其他替换为0

数组拼接Joining

t3 = np.vstack((t1,t2))#竖直拼接,沿列堆叠
t4 = np.hstack((t1,t2))#水平拼接,沿行堆叠
arr = np.dstack((arr1, arr2))#沿高度堆叠,该高度与深度相同
t[[1,2],:]= t[[2,1],:] #行交换
t[:,[0,2]] = t[:,[2,0]]#列交换
arr = np.concatenate((arr1, arr2))#连接两个数组(水平)
arr = np.concatenate((arr1, arr2), axis=1)#沿着行 (axis=1) 连接两个 2-D 数组

数组拆分Spliting

split()#数量不足时报错
np.split(A,2,axis=1)#把A分成2块,纵向分割,等份
array_split() #数量不足时自动调整元素
newarr = np.array_split(arr, 3)#将数组分为 3 部分,不等分割
print(newarr[0])#访问拆分的数组
newarr = np.array_split(arr, 3, axis=1)#沿行拆分
newarr = np.hsplit(arr, 3)竖直拆分
newarr = np.vsplit(arr, 3)水平拆分

数组计算

NumPy 数学函数

NumPy 提供了标准的三角函数:sin()、cos()、tan()。

舍入函数

numpy.around() 函数返回指定数字的四舍五入值。

numpy.around(a,decimals)#decimals: 舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置

numpy.floor() 返回小于或者等于指定表达式的最大整数,即向下取整。

np.floor(a)

numpy.ceil() 返回大于或者等于指定表达式的最小整数,即向上取整。

np.ceil(a)

NumPy 算术函数
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a ** 2)
print(a < b) print(a > b)

NumPy 算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide()。需要注意的是数组必须具有相同的形状或符合数组广播规则。

numpy.reciprocal() 函数返回参数逐元素的倒数。如 1/4 倒数为 4/1

np.reciprocal(a)

numpy.power() 函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。

numpy.mod() 计算输入数组中相应元素的相除后的余数。 函数 numpy.remainder() 也产生相同的结果。

矩阵相乘

矩阵相乘,就是矩阵的乘法操作,要求左矩阵的列和右矩阵的行数要一样,即MN维矩阵乘以和NY维矩阵

a = np.array([1,1],[0,1]])
b = np.arange(4).reshape((2,2))
c=a*b

点乘

矩阵点乘,就是矩阵各个对应元素相乘,要求矩阵必须维数相等,即MxN维矩阵乘以MxN维矩阵 。

c_dot = np.dot(a,b)
c_dot= a.dot(b)

广播机制broadcast

当两个数组的形状并不相同的时候,我们可以通过扩展数组的方法来实现相加、相减、相乘等操作,这种机制叫做广播(broadcasting)。

广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。

广播会在缺失和(或)长度为1的维度上进行。

这句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。

shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?可以

shape为(3,3,3)的数组能够和(3,2)的数组进行计算么?不可以

数组查找

x = np.where(arr == 4)#查找值为 4 的索引
x = np.where(arr%2 == 0)#查找值为偶数的索引
x = np.where(arr%2 == 1)#查找值为奇数的索引
x = np.searchsorted(arr, 7)#查找应在其中插入值 7 的索引,该方法从左侧开始搜索,并返回第一个索引,其中数字 7 不再大于下一个值。
x = np.searchsorted(arr, 7, side='right')#从右边开始查找应该插入值 7 的索引
x = np.searchsorted(arr, [2, 4, 6])#查找应在其中插入值 2、4 和 6 的索引

数组排序

a = np.sort(arr)#对数组进行排序,此方法返回数组的副本,而原始数组保持不变。
arr = np.array(['banana', 'cherry', 'apple']) print(np.sort(arr))#对数组以字母顺序进行排序
arr = np.array([True, False, True]) print(np.sort(arr))#对布尔数组进行排序
arr = np.array([[3, 2, 4], [5, 0, 1]])print(np.sort(arr))#对 2-D 数组排序

读取本地文件

不咋用,pandas大法更好用

np.loadtxt(file_path,delimiter,dtype)
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)

nan和inf

nan

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

什么时候numpy中会出现nan:

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

nan注意的点

  • 两个nan是不相等的
  • np.nan!=np.nan
  • np.count_nonzero(na.nan!=np.nan)
  • nan和任何值计算都是nan
  • 判断一个值是否为nan np.isnan(a)
  • np.isnan(t1)效果和np.nan!=np.nan相同

inf

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

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

copy和view

副本和数组视图之间的主要区别在于副本是一个新数组,而这个视图只是原始数组的视图。

a=b 完全不复制,a和b相互影响
a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
a = b.copy(),复制新数组,a和b互不影响
x = arr.view()#arr[0] = 61更改原数组,新数组也改变
x = arr.view()#x[0] = 61更改新数组,原数组也改变

检查数组是否拥有数据
print(x.base)
副本返回 None。
视图返回原始数组。

numpy常用统计方法

创建一个全0的数组: np.zeros((3,4))

创建一个全1的数组:np.ones((3,4))

创建一个对角线为1的正方形数组(方阵):np.eye(3)

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

最小值位置索引:np.argmin(t,axis=1)

最大值位置索引:np.argmax(t,axis=0)

求和:t.sum(axis=None)#axis控制行或列

累加:print(np.cumsum(A))

差值:print(np.diff(A))

均值:t.mean(a,axis=None) a.mean()). np.average(A)受离群点的影响较大

中值:np.median(t,axis=None)

最大值:t.max(axis=None)

最小值:t.min(axis=None)

极值:np.ptp(t,axis=None) 即最大值和最小值之差

标准差:t.std(axis=None)

标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值

反映出数据的波动稳定情况,越大表示波动越大,约不稳定

你可能感兴趣的:(python,技术总结)