numpy && pandas

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] # 6
nd[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:step
nd[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 b
plt.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是20
nd
# 参数 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()
# 参数 以元组的形式传入要拼接的ndarray
np.concatenate((nd,nd))  # 默认是纵向拼接(以最外层 为轴线做拼接)
# 参数 axis 用来设定 拼接的轴向 默认 axis=0
np.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 用来指定对哪个轴线进行切分 默认值是0
np.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()
nd3
id(nd),id(nd3)
nd3[0,0] = 0
nd3
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 true
np.all    N/A    Evaluate whether all elements are true
np.sum(nd)  # axis默认是None 表示对所有值进行加和
np.sum(nd,axis=0)  # 按照轴线方向进行加和
np.any(nd)  # any就是看所有的值中有没有True
np.all(nd)  # 是不是所有的都是True
np.any(nd,axis=0)  # 顺着轴线方向 看有没有True
np.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 里面的B
s.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默认是5
s1.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.sum
nd.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

(2) Series之间的运算

在运算中自动对齐不同索引的数据
如果索引不对应,则补NaN

你可能感兴趣的:(numpy && pandas)