为了账号安全,请及时绑定邮箱和手机立即绑定

numpy && pandas

标签:
Java

NumPy

二、ndarray的属性

4个必记参数:

ndim:维度

shape:形状(各维度的长度)

size:总长度

dtype:元素类型

三、ndarray的基本操作

1. 索引

基本索引:一维与列表完全一致 多维同理

import numpy as np
nd = np.random.randint(0,10,size=5)
nd
nd[0]
nd[1]
nd[-1]
nd = np.random.randint(0,10,size=(3,4))  # 这是一个二维数组 里面有3个元素 里面各有4个元素nd
nd[0][0]nd[0][-1]nd[-1][-1]

高级索引:整数数组形式的索引

nd = np.random.randint(0,10,size=(5,6))
nd
nd[0][0]# 多维数组还有 整数数组形式的索引nd[0,0]  # 最外层,往里一层 层层深入nd[-1,-1]nd[-1,]nd[-1,[1,3,5]]  # 最外围的最后一个,往里一层取索引是1 3 5三个nd[-1,[5,3,1]]  # 顺序任意nd[-1,[5,5,5]]nd[-1,[-1,-1,-1]]

使用数组索引寻找指定位置的值

nd[0,0,0,0] # 6nd[0,0,0,1]nd[0,0,1,2]nd[0,2,1,-1]  # 4
nd = np.random.randint(0,10,size=(5,4,3,7))  # 这是一个四维数组 里面有5个元素 里面各有4个元素 里面各有3个元素 里面各有7个元素nd

2. 切片

一维与列表切片完全一致 多维时同理

# 取最外层nd[0:2]nd[:2]nd[2:]nd[:]# 往里取nd[:,0:2]nd[:,:2]nd[:,2:]

取项尚人头

import matplotlib.pyplot as plt
jin = plt.imread('./data/jin.png')
jin
plt.imshow(jin)
jin.shape
jin[25:140]
plt.imshow(jin[25:140])
plt.imshow(jin[25:140,180:])
plt.imshow(jin[25:140,180:250])

两个:: 的形式 进行切片和翻转

# 格式 start:end:stepnd[0:4:2]nd[:,::2]nd[:,::3]nd[:,::-1]nd[:,::-2]

图片的上下颠倒 左右颠倒 变瘦 色值的交换

plt.imshow(jin[::-1])plt.imshow(jin[:,::-1])plt.imshow(jin[::-1,::-1])plt.imshow(jin[::3])plt.imshow(jin[:,::3])
# 最外层是行 往里一层是列 最里面是颜色
# r g bplt.imshow(jin[:,:,::-1])plt.imshow(jin[:,:,[0,1,2]])plt.imshow(jin[:,:,[1,0,2]])  # 绿巨人plt.imshow(jin[:,:,[1,2,0]])

3. 变形

使用reshape函数,注意参数是一个tuple!

nd = np.random.randint(0,10,size=(5,4))  # 5行4列 size是20nd
# 参数 shape 是一个元素nd.reshape((4,5))  # 改变形状 只要size不变 变成什么形状都可以nd.reshape((2,10))nd.reshape((1,20))  
nd.reshape((5,5))  # 但是 如果size不一样就不行了

4. 连结

np.concatenate()

连结需要注意的点:

  • 连结的参数是列表:一定要加小括号

  • 必须 维度相同 形状相符

  • 连结的方向默认是shape这个tuple的第一个值所代表的维度方向

  • 可通过axis参数改变连结的方向

# 注意 concatenate 是 np模块提供的方法 所以用的时候是 np.concatenate() 不是 ndarray.concatenate()# 参数 以元组的形式传入要拼接的ndarraynp.concatenate((nd,nd))  # 默认是纵向拼接(以最外层 为轴线做拼接)# 参数 axis 用来设定 拼接的轴向 默认 axis=0np.concatenate((nd,nd),axis=0)
np.concatenate((nd,nd),axis=1)

5. 切分

与级联类似,三个函数完成切分工作:

  • np.split

  • np.vsplit

  • np.hsplit

# split 也是np模块直接提供的# 参数# ary 指定是 要进行切分的数组# indices_or_sections 用来指定要切分成几部分 或者在哪里切分# axis 用来指定对哪个轴线进行切分 默认值是0np.split(nd,2)
np.split(nd,2,axis=0)
np.split(nd,2,axis=1)# indices_or_sections 可以是整数 也可以是一维数组np.split(nd,[2,4],axis=0)

6. 副本

所有赋值运算不会为ndarray的任何元素创建副本。对赋值后的对象操作也会影响原数组。
可使用copy()函数创建副本

nd3 = nd.copy()
nd3id(nd),id(nd3)
nd3[0,0] = 0nd3
nd

四、ndarray的聚合操作

1. 求和np.sum

2. 最大最小值:np.max/ np.min

### 3\. 其他聚合操作[](http://localhost:8888/notebooks/00/02/c01_numpy.ipynb#3.-%E5%85%B6%E4%BB%96%E8%81%9A%E5%90%88%E6%93%8D%E4%BD%9C)
Function Name    NaN-safe Version    Description
np.sum    np.nansum    Compute sum of elements 所有元素的和
np.prod    np.nanprod    Compute product of elements 所有元素的乘积
np.mean    np.nanmean    Compute mean of elements
np.std    np.nanstd    Compute standard deviation
np.min    np.nanmin    Find minimum value
np.max    np.nanmax    Find maximum value
np.argmin    np.nanargmin    Find index of minimum value
np.argmax    np.nanargmax    Find index of maximum value
np.any    N/A    Evaluate whether any elements are truenp.all    N/A    Evaluate whether all elements are true
np.sum(nd)  # axis默认是None 表示对所有值进行加和np.sum(nd,axis=0)  # 按照轴线方向进行加和np.any(nd)  # any就是看所有的值中有没有Truenp.all(nd)  # 是不是所有的都是Truenp.any(nd,axis=0)  # 顺着轴线方向 看有没有Truenp.all(nd,axis=0)  # 顺着轴线方向 看是否都是True

np.argwhere

# 按照条件查询位置np.argwhere(nd == 3)
np.argwhere(nd > 8)
# 数值 和 NaN 做运算 结果 是 NaN nd = np.array([1,2,3,np.NAN])
nd
np.sum(nd)np.nansum(nd)  # 把nan当成0来处理

五、ndarray的矩阵操作

1. 基本矩阵操作

  1. 算术运算符:

  • 加减乘除

nd + 1
nd - 1
nd * 2
nd / 2  # 广播机制
  1. 矩阵积np.dot()

# AB 如果想运算# A有多少列 B就要有多少行 这样才能对应位置相乘# 如果A是 n行m列 B是 i行j列 (i的值要等于m)# 乘出来的结果 是 n行j列 的矩阵nd2 = np.random.randint(0,10,size=(3,1))
nd2
np.dot(nd1,nd2)

2. 广播机制

【重要】ndarray广播机制规则

  • 缺失元素用已有值填充

例1: m = np.ones((2, 3)) a = np.arange(1,4,1) 求m+a

m = np.ones((2, 3))
m
a = np.arange(1,4,1)
a
m + a

例2: a = np.arange(3).reshape((3, 1)) b = np.arange(3) 求a+b

a = np.arange(3).reshape((3, 1)) 
a
b = np.arange(3)
b
a + b

六、ndarray的排序

1. 快速排序

np.sort()与ndarray.sort()都可以,但有区别:

  • np.sort(ndarray) 不改变输入

  • ndarray.sort() 本地处理,不占用空间,但改变输入

np.sort(nd)  # np.sort对ndarry进行排序 只是返回一个排序好的数组 对原数组不影响nd.sort()  # ndarr对象也有sort 这个sort没有返回值 而是对自身进行改变nd

2. 部分排序

np.partition(a,k)

有的时候我们不是对全部数据感兴趣,我们可能只对最小或最大的一部分感兴趣。

  • 当k为正时,我们想要得到最小的k个数

  • 当k为负时,我们想要得到最大的k个数

np.partition(nd,kth=5)  # 排在最前面的5个肯定是最小的5个np.partition(nd,kth=3)
np.partition(nd,kth=-3)
np.partition(nd,kth=-5)

Pandas的数据结构

导入pandas:

数据分析三剑客 numpy pandas matplotlib

1、Series

Series是一种类似于一维数组的对象,由下面两个部分组成:

  • index:相关的数据索引标签

  • values:一组数据(ndarray类型)

s = Series([1,2,3,4])
s
s.index  # 索引s.values  # 内容
#### 1)Series的创建[](http://localhost:8888/notebooks/00/02/c02_pandas_objects.ipynb#1%EF%BC%89Series%E7%9A%84%E5%88%9B%E5%BB%BA)两种创建方式:

(1) 由列表或numpy数组创建

默认索引为0到N-1的整数型索引

还可以通过设置index参数指定索引 (注意:索引的个数和值的个数要对应)
s = Series(data=[1,2,3,4],index=list('ABCD'))
s

(2) 由字典创建

Series({'A':1,'B':2,'C':3,'D':4})

2)Series的索引和切片

可以使用中括号取单个索引(此时返回的是元素类型),或者中括号里一个列表取多个索引(此时返回的仍然是一个Series类型)。分为显示索引和隐式索引:

(1) 显式索引:

  • 使用index中的元素作为索引值

  • 使用.loc[](推荐)

注意,字符索引是闭区间 [start,end]

s['A']
s.loc['A']
s.loc['A':'C']  # A B C 注意 C 也能取到# s.loc['A','B']  # 坑: 要想获取A B 不是 A,B 这个表示 最外层的A 里面的Bs.loc[['A','B']]
s.loc[['A','B','C']]
s.loc[['A','A','A']]

(2) 隐式索引:

  • 使用整数作为索引值

  • 使用.iloc[](推荐)
    注意,编号索引是左闭右开区间 [start,end)

s[0]
s.iloc[0]
s.iloc[0:3]  # 字符索引 [start,end] 数值索引 [start,end) end取不到s.iloc[:]
s.iloc[::2]

3)Series的常用属性和方法

可以把Series看成一个定长的有序字典

可以通过shape,size,index,values等得到series的属性
可以通过head(),tail()快速查看Series对象的样式

s.head(2)看头两个 s.tail(1)看后一个

s1.head(2)  # 取前面的n个数据 展示 n默认是5s1.head()s1.tail(1)  # 取后面的n个数据 展示

Series中如果值是None,会被转成NaN。并且计算时会被当成0(ndarray不会)

s2 = Series([1,2,3,None,np.NAN])
s2
s2.sum()  # series 中 如果有None会被自动转换成NaN 而且 计算的时候会自动把NaN当成0来计算
nd = np.array([1,2,3,None,np.NAN])
nd
np.sumnd.sum()  # 多维数组 如果有None 求和会报错 如果有nan求和 和是nan

可以使用pd.isnull(),pd.notnull(),或自带isnull(),notnull() 函数检测值为None或NaN的数据

s2.isnull()s2.notnull()

另外 series对象有一个name属性可以用来区分不同的series

nd1 = np.random.randint(0,150,size=5)
nd1
s1 = Series(data=nd1,index=list('abcde'),name='english')
s1
nd2 = np.random.randint(0,150,size=6)
nd2
s2 = Series(data=nd2,index=list('abcdef'),name='python')
s2

4)Series的运算

(1) 适用于numpy的数组运算也适用于Series

s2 + 4
s2 * 2



作者:仙灵儿
链接:https://www.jianshu.com/p/694d1d462d9d


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消