numpy库学习---个人总结笔记

目录

一.前言

二.numpy库基础知识

 2.1数组的芝士:

2.2 创建数组

2.3改变数组形状

2.4数组的运算

2.4.1数组与实数的运算

2.4.2数组与数组的运算

 三.numpy读取数据

3.1基本概念(轴)

3.2 numpy读取数据

3.3 numpy转置方法(补充)

四. numpy的索引与切片

4.1常见的切片索引需求

4.2 numpy中数值的修改

4.3 布尔索引

4.4 三元运算符(where)和裁剪(clip)

4.5 numpy中的nan和inf

4.6 numpy中常见的统计方法

4.7 numpy应用实例(数据处理)

五. 数组的拼接

5.1 拼接的方式(水平/竖直)

六.numpy生成随机数

6.1常用参数

6.2 numpy的注意点


一.前言

笔记学习内容主要来源:NumPy 教程 | 菜鸟教程 (runoob.com),其中个别函数具体使用方法可参考网页中的内容。

numpy库的应用:通常与scipy(scientific python)和matplotlib(绘图库)结合使用,这种组合主要是为了替代matlab,有助于我们用python学习数据科学和机器学习。

二.numpy库基础知识

nadarry:数组

 2.1数组的芝士:

1.数据类型(dtype)#类似python中的数据类型,可进行选择,例如:bool;int;float;complex;

2.数组形状(shape)#用来描述数组中的数据为几行几列。

        数组的常用属性:

ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape

数组的维度,对于矩阵,n 行 m 列

ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype ndarray 对象的元素类型

示例

import numpy as np
a=np.array(range(10),dtype=int) #dtype可以指定数据类型,如float#
print(a)
print(a.shape)   #输出数据形状
b=a.reshape((2,5))  #改变a的数据形状为2行5列
print(b)
print(b.shape)
print(a.dtype)   #输出a中的数据类型
print(type(a))

输出:

[0 1 2 3 4 5 6 7 8 9]
(10,)        #代表一维数据,1行10列
[[0 1 2 3 4]
 [5 6 7 8 9]]
(2, 5)
int32

2.2 创建数组

代码:

#三种方法如下:
import numpy as np
a=np.array([1,2,2,3,4]) #方法一
b=np.array(range(1,10)) #方法二
a=np.array([[1,2,2,3,4],[2,3,4]]) #方法二,必须放在一个【】中,否则会报错
c=np.arange(1,6)        #方法三
print(a)
print(b)
print(c)

输出:

[1 2 2 3 4]
[1 2 3 4 5 6 7 8 9]
[list([1, 2, 2, 3, 4]) list([2, 3, 4])]
[1 2 3 4 5]

2.3改变数组形状

shape 和 reshape

import numpy as np
a=np.array([[1,2,3],[4,5,6]])
print(a)
print(a.shape)       #获取a的数组形状
#改变数组形状需注意改变后的大小不变
a1=a.reshape((3,2))  #将a改为3行2列
a2=a.reshape((6,))   #将a改为一维
a3=a.reshape((6,1))  #将a改为6行1列
a4=a.reshape((1,6))  #将a改为1行6列
a5=a.reshape((a.shape[0]*a.shape[1],)) #a.shape[0]和a.shape[1]分别代表行和列
a6=a.flatten()       #将a转为一维形状
print(a1)
print(a2)
print(a3)
print(a4)
print(a5)
print(a6)

输出:

[[1 2 3]
 [4 5 6]]
(2, 3)
[[1 2]
 [3 4]
 [5 6]]
[1 2 3 4 5 6]
[[1]
 [2]
 [3]
 [4]
 [5]
 [6]]
[[1 2 3 4 5 6]]
[1 2 3 4 5 6]
[1 2 3 4 5 6]

2.4数组的运算

运算:加减乘除;分为数组与实数的运算,数组与数组的运算;代码示例如下

2.4.1数组与实数的运算

import numpy as np
#创建一个数组
a=np.array([[0,1,2,3,4,5],
            [6,7,8,9,10,11],
            [12,13,14,15,16,17],
            [18,19,20,21,22,23]])
#数组与实数的加法:将数组的每一个数都相加
print(a+2)
#数组与实数的乘法:将数组的每一个数都相乘
print(a*2)
#数组与实数的除法:将数组的每一个数都相除;可以对0进行运算(其中inf:无穷大;nan:非实数)
print(a/2)
print(a/0)

输出

​[[ 2  3  4  5  6  7]
 [ 8  9 10 11 12 13]
 [14 15 16 17 18 19]
 [20 21 22 23 24 25]]
[[ 0  2  4  6  8 10]
 [12 14 16 18 20 22]
 [24 26 28 30 32 34]
 [36 38 40 42 44 46]]
[[ 0.   0.5  1.   1.5  2.   2.5]
 [ 3.   3.5  4.   4.5  5.   5.5]
 [ 6.   6.5  7.   7.5  8.   8.5]
 [ 9.   9.5 10.  10.5 11.  11.5]]
[[nan inf inf inf inf inf]
 [inf inf inf inf inf inf]
 [inf inf inf inf inf inf]
 [inf inf inf inf inf inf]]

2.4.2数组与数组的运算

import numpy as np
#创建一个数组
a=np.array([[0,1,2,3,4,5],
            [6,7,8,9,10,11],
            [12,13,14,15,16,17],
            [18,19,20,21,22,23]])
#创建一个形状相同的数组进行运算
b=np.arange(100,124).reshape((4,6))
print(a+b) #对应元素相加或乘除,这里就不演示了
#创建不同维度的数组进行运算
c=np.arange(0,6)
print(a+c)  #因为列相同所以每列可以进行运算
d=np.arange(0,4).reshape((4,1))
print(a+d)  #因为行数相同所以也可以进行运算,即每行进行相加减
#总结:只要运算的数组行与列其中存在相同就可以运算满足广播原则,对于三维只要存在某个空间形状相同也可以进行运算。
###广播原则如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。
#广播会在缺失和(或)长度为1的维度上进行。 这句话乃是理解广播的核心。 广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,
#另外一种是有一方的长度为1。

输出

[[100 102 104 106 108 110]
 [112 114 116 118 120 122]
 [124 126 128 130 132 134]
 [136 138 140 142 144 146]]
[[ 0  2  4  6  8 10]
 [ 6  8 10 12 14 16]
 [12 14 16 18 20 22]
 [18 20 22 24 26 28]]
[[ 0  1  2  3  4  5]
 [ 7  8  9 10 11 12]
 [14 15 16 17 18 19]
 [21 22 23 24 25 26]]

 三.numpy读取数据

3.1基本概念(轴)

axis:可以理解为方向,使用数字0,1,2等数字表示,对于一维数组,只有一个0轴;对于2维数组(shape(2,2)),有0轴和1轴,引入这个概念是为了计算数组的平均值的时候,可以进行指定是哪个方向上的数字的平均值。例如:

np.arange(0,10).reshape((2,5))
#reshape中2表示0轴上长度为2,5表示1轴上长度为5.

3.2 numpy读取数据

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

 #参数:

  1. frame:文件/字符串或路径,可以是.gz或bz2压缩文件
  2. dtype:数据类型,可选。
  3. delimiter:分隔字符串,默认是空格,可以改为逗号
  4. skiprows:跳过前x行
  5. usecols:读取指定的列,索引,元组类型
  6. unpacks:默认False,可以理解为有多少数据就有多少行;如果为True,读入属性将分别写入不同数组变量,可以理解为转置开关。

示例编写:

import numpy as np
file_path="C:\Program Files\Python38"  #文件路径相当于那个frame
a=np.loadtxt(file_path,delimiter=",",dtype="int") #定义参数
print(a)

#这里没有提供相应的文件,只是简单示例编写方法。

3.3 numpy转置方法(补充)

#补充一下numpy中转置的三种方法(除了改变unpack):

  1. a.swapaxes(1,0) #这里的1,0代表轴
  2. a.transpose()
  3. a.T
    import numpy as np
    a=np.array(range(18)).reshape((3,6))
    print(a)
    b=a.transpose()
    c=a.T
    d=a.swapaxes(1,0)
    print("*"*100)
    print(b)
    print("*"*100)
    print(c)
    print("*"*100)
    print(d)

    输出:

[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]]
****************************************************************************************************
[[ 0  6 12]
 [ 1  7 13]
 [ 2  8 14]
 [ 3  9 15]
 [ 4 10 16]
 [ 5 11 17]]
****************************************************************************************************
[[ 0  6 12]
 [ 1  7 13]
 [ 2  8 14]
 [ 3  9 15]
 [ 4 10 16]
 [ 5 11 17]]
****************************************************************************************************
[[ 0  6 12]
 [ 1  7 13]
 [ 2  8 14]
 [ 3  9 15]
 [ 4 10 16]
 [ 5 11 17]]

四. numpy的索引与切片

4.1常见的切片索引需求

注意:numpy中的索引和python中类似,也是从0开始;

直接上代码示例:

import numpy as np
# a=np.array(range(18)).reshape((3,6))
a=np.array([[0,1,2,3],
            [4,5,6,7],
            [8,9,10,11]])
print(a)
#取一行或多行
print("*"*100)
print(a[1]) #第二行
print("*"*100)
print(a[1:3]) #取连续多行
print("*"*100)
print(a[[0,2]]) #取不连续多行,注意其中有两个【】

#取一列或多列
print("*"*100)
print(a[:,2]) #取第三列;取列的方法在下面会详细介绍;
print("*"*100)
print(a[:,2:4])

#取多行和多列:取的是交叉的点
print("*"*100)
print(a[0:2,1:3])
#取多个不相邻的点
print(a[[1,1],[1,2]]) #取出的是(1,1);(1,2)对应的点??

4.2 numpy中数值的修改

import numpy as np
# a=np.array(range(18)).reshape((3,6))
a=np.array([[0,1,2,3],
            [4,5,6,7],
            [8,9,10,11]])
a[:,1:3]=0  #将切片数据赋值为0
print(a)
print("*"*100)
print(a<5)   #a中小于5的为true

输出:

[[ 0  0  0  3]
 [ 4  0  0  7]
 [ 8  0  0 11]]
*******************************************************************************************
[[ True  True  True  True]
 [ True  True  True False]
 [False  True  True False]]

4.3 布尔索引

import numpy as np
# a=np.array(range(18)).reshape((3,6))
a=np.array([[0,1,2,3],
            [4,5,6,7],
            [8,9,10,11]])
a[a<5]=0
print(a)

输出

[[ 0  0  0  0]
 [ 0  5  6  7]
 [ 8  9 10 11]]

4.4 三元运算符(where)和裁剪(clip)

注意:一个是np.where;另一个为a.clip;使用方法不同。

import  numpy as np
a=np.arange(24).reshape((4,6))
b=np.where(a<10,0,10) #numpy的三元运算符,将a中小于10的数赋值为0,大于的赋值为10
print(b)
print("*"*80)
c=a.clip(10,18)  #裁剪,小于10替换为10,大于18替换为18;
print(c)

输出:

[[ 0  0  0  0  0  0]
 [ 0  0  0  0 10 10]
 [10 10 10 10 10 10]
 [10 10 10 10 10 10]]
********************************************************************************
[[10 10 10 10 10 10]
 [10 10 10 10 10 11]
 [12 13 14 15 16 17]
 [18 18 18 18 18 18]]

4.5 numpy中的nan和inf

  1. nan:not a number:不是一个数字;当打开一个文件时,文件数据缺失的部分就为nan,或者做一个不合适的计算的时候(比如inf减去inf)
  2. inf:表示正无穷大;-inf表示负无穷大

注意:nan和inf的数据类型为float;如果想进行数据转换,需要进行先将数据dtype设置为float

import numpy as np
# 两个nan是不相等的
print(np.nan==np.nan)
print(np.nan!=np.nan)
#利用以上特性可以计算出数据中nan的个数
a=np.array([1.,3.,np.nan])
print(np.count_nonzero(a!=a)) #count_nonzero:统计非0的数据的个数
#将判断为nan的数值赋值为0:对数据进行判断:用isnan():统计数据中为nan的个数时用
a[np.isnan(a)]=0
print(a)

输出:

False
True
1
[1. 3. 0.]

nan的处理:在数据分析中如果出现nan时:一般将其所在行删除,或者将nan位置的数值替换为该列的平均值,选择后者一般不影响数据的完整性。因此下一节介绍一些常用的numpy中的统计方法

4.6 numpy中常见的统计方法

  1. 求和:a.sum(axis=None)  #nan和任何值的运算结果都为nan。
  2. 均值:a.mean(a,axis=None)
  3. 中值:np.median(a,axis=None)
  4. 最大/小值:a.max/min(axis=None)
  5. 极值:np.ptp(a,axis=None)  #最大值和最小值的差
  6. 标准差:a.std(axis=None)  #代表这些数值接近平均值反映数据的波动稳定情况,越大表示波动越大。
import numpy as np
a=np.array([[0,1,2,3],
            [4,5,6,7],
            [8,9,np.nan,10]])
#sum
print(a.sum(axis=0)) #求和列
print(a.sum())  #总求和
#median
print(np.median(a,axis=0)) #求中值

输出:

[12. 15. nan 20.]
nan
[ 4.  5. nan  7.]

4.7 numpy应用实例(数据处理)

import  numpy as np

def fill_ndarray(a):
    for i in range(a.shape[1]): #遍历每一列
        tem_col=a[:,i]  #当前列
        nan_num=np.count_nonzero(tem_col!=tem_col)
        if nan_num !=0: #不为0,说明当前列有nan
            tem_not_nan_col=tem_col[tem_col==tem_col] #当前列不为nan的array
            #选当前为nan的位置,将不为nan的均值赋值给nan
            tem_col[np.isnan(tem_col)]=tem_not_nan_col.mean()
    return a

if __name__=="__main__":
    a = np.arange(12).reshape((3, 4)).astype("float") #astype将数据类型设置为float
    a[1, 2:] = np.nan
    print(a)
    print("*"*80)
    a=fill_ndarray(a)
    print(a)

输出:

[[ 0.  1.  2.  3.]
 [ 4.  5. nan nan]
 [ 8.  9. 10. 11.]]
********************************************************************************
[[ 0.  1.  2.  3.]
 [ 4.  5.  6.  7.]
 [ 8.  9. 10. 11.]]

五. 数组的拼接

5.1 拼接的方式(水平/竖直)

import numpy as np
a=np.array([[1,2,3,4],
             [5,6,7,8]])
b=np.array([[9,10,11,12],
             [13,14,15,16]])
#竖直拼接vstack
print(np.vstack((a,b)))
#水平拼接 hstack
print("*"*80)
print(np.hstack((a,b)))

输出:

[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [13 14 15 16]]
********************************************************************************
[[ 1  2  3  4  9 10 11 12]
 [ 5  6  7  8 13 14 15 16]]

5.2 交换行/列

目的:为了两个数据的数据处理

import numpy as np
a=np.arange(12,24).reshape((3,4))
print(a)
print("*"*80)
#行交换
a[[1,2],:]=a[[2,1],:]
print(a)
print("*"*80)
#列交换
a[:,[0,2]]=a[:,[2,0]]
print(a)
print("*"*80)
#补充:构造全为0/1的数组
b=np.zeros((2,3))
c=np.ones((3,3))
print(b)
print(c)
print("*"*80)
#创建一个全为1的正方形数组eye()
d=np.eye(3)
print(d)
print("*"*80)
#获取最大最小值的位置
print(a)
print(np.argmax(a,axis=0))
print(np.argmin(a,axis=1))

输出:

[[12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]]
********************************************************************************
[[12 13 14 15]
 [20 21 22 23]
 [16 17 18 19]]
********************************************************************************
[[14 13 12 15]
 [22 21 20 23]
 [18 17 16 19]]
********************************************************************************
[[0. 0. 0.]
 [0. 0. 0.]]
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
********************************************************************************
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
********************************************************************************
[[14 13 12 15]
 [22 21 20 23]
 [18 17 16 19]]
[1 1 1 1]
[2 2 2]

六.numpy生成随机数

6.1常用参数

  1. .rand(d0,d1,d2,,,,dn):创建d0到dn维度的均匀分布的随机数组,浮点数,范围:0-1
  2. .randn(d0,d1,d2,,,,dn):创建d0到dn维度的标准正态分布随机数,浮点数,平均数0,标准差1
  3. .randint(low,high,(shape)):从给定上下限范围选取随机整数,范围是low,high,形状时shape
  4. .uniform(low,high,(size)):产生均匀分布的数组,low起始值,high结束值,size形状
  5. .seed(s):随机数种子,作用同python

6.2 numpy的注意点

  1. a=b 完全不复制,a和b相互影响
  2. a=b[:],一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化时一致的
  3. a=b.copy(),复制,a和b互不影响。

你可能感兴趣的:(库的学习,python)