Fork me on GitHub

数据分析 - NumPy

作为机器学习三大重要工具之一,NumPy科学计算库具有非常重要的作用

分步骤解释代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import numpy as np  # 导入必须库

print(np.__version__) # 打印numpy库的版本信息

Z = np.zeros(10)
print(Z) # 打印一个十维的空向量

# 计算任何一个数组所占的内存空间大小
Z = np.zeros((10,10)) # 创建包含10个空向量的数组
print("%d bytes" % (Z.size * Z itemsize))

# print(Z)
"""
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
"""

# 从命令行获取numpy add 函数的文档
%run 'python -c "import numpy; numpy.info(numpy.add)"'

基础操作

创建array

1.使用np.array()由list创建

  • numpy默认ndarray的所有元素的类型是相同的
  • 若传入列表数据包含不同的类型,则统一为同一类型,优先级: str>float>int
1
2
3
4
5
6
nl = np.array([3,1,4,5]),
n1
n2 = np.array([2,4,5],[4,42,5])
n2
n3 = np.array(list('ABC'))
n3

2.使用np的routines函数创建

命令 : np.ones(shape, dtype=float, order="C")

解释: ones 代表输出的矩阵元素全为一

1
2
np.ones(shape = (4,5), dtype = int)
# (4,5) 四行五列

同理,创建一个元素全为0的矩阵

1
np.zeros((4,4))

创建一个自选值的矩阵

1
np.full((5,5), fill_value = 50)

3.创建单位矩阵

语法: np.eye(N, M=None, k=0, dtype=float)

1
np.eye(3)

4.显示一个元素线性均匀分割矩阵

语法: np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

1
2
#lin - linear 线性
np.linspace(0,100,20)

5.排列(等差)矩阵arrange

语法: np.arange([start,]stop,[step]dtype=None)

区间为左闭右开

1
np.arange(0,100,2)

5.创建array副本

当使用等号进行ndarray的赋值时,如 n1=n,则此时n1和n互相使用同一内存地址,若改变n1的值,则n也会改变。

解决方法:为ndarray创建副本,对副本进行修改,而原ndarray不会变化

1
2
3
4
5
6
7
l = [1,2,3,4]
n = np.array(l)
n1 = n.copy()
n1[0] = 5
print(n1, n)
# n1 = [5,2,3,4]
# n = [1,2,3,4]

随机数

1.生成随机数矩阵

随机整数

语法: np.random.randint(low, high=None. size=None, dtype="l")

  • low-high : 代表随机数的范围
  • size : 代表生成矩阵元素个数
1
np.random.randint(0,100)

标准正态分布矩阵

代码: np.random.randn(d0,d1,...)

1
2
# 生成100个随机数
np.random.randn(100)

高斯分布抽取随机样本矩阵

语法: np.random.normal(loc=0.0, scale=1.0, size=None)

  • loc:代表分布的平均值(“中心”)。
1
2
3
# scale 为波动系数,代表着数据的波动程度
# size 为数据元素个数
np.random.normal(loc= 175, scale=5, size=50)

2.使用随机数生成一张照片

语法: np.random.random(size-None)

1
2
# size第三参数为矩阵的个数
np.random.random(size=(200,300.3))

索引

一维与列表完全一致,多维同理

1
2
3
4
5
6
7
8
# 创建元素位于0-100的3*4维矩阵
n = np.random.randint(0,100,(3,4))
# 索引用法: n[row,col] 即【对应的行数,对应的列数】
n[0,1] # 第一行,第二列
# 多维
n1 = np.random.randint(0,100,(3,4,5)) # 五个3*4矩阵
# 索引 [第几个矩阵,第几行, 第几列]
n1[0,3,2] # 第一个矩阵 第四行 第三列

切片

1
2
3
4
5
6
7
8
n = np.random.randint(100,size=10)
# 切片时,左闭右开
n[0:2]
# 多个矩阵切片,则切的是第几个矩阵
n1 = np.random.randint(0,100,(3,4,5)) # 五个3*4矩阵
n1[0:1] # 返回第一个矩阵
n1[0:1, 1:3] # 返回第一个矩阵的第二到第四行
n1[0:1, 1:3-2:] # 返回第一个矩阵的第二到第四行的倒数第二列一直到最后一列

使用切片来反转数据

1
2
3
4
n = np.arange(0,10,1)
# array([0,1,..,9])
n[::-1] # 使用步数step来操作
# array([9,..,2,1])

变形

1.使用reshape函数

将一维10个元素的矩阵变为5*2矩阵

1
2
3
n.shape
# (10,)
n.reshape((5,2))

将机器学习中,多维数据便于图形展示与可视化,而将多维数据转换为一维数据便于计算

1
2
3
4
5
6
n.shape
# (450,160,3)
# 将n转为一维
n.reshape(450*160*3)
# 或者
n.reshape(-1)
其实,如果reshape()方法内的参数为任意负数,则直接将多维矩阵转化为一维的数组ndarray

2.将矩阵横向。纵向转置

  • 垂直转置 np.vstack(ndarray0)
1
2
3
4
5
6
# vertical 垂直
# n = [1,2,3]
n1 = np.vstack(n)
# array([1]
# [2]
# [3])
  • 横向转置 np.hstack(ndarray)
可以将多维数组转换为一维数组
1
2
3
n = np.array([[1,2,3],[4,5,6]])
np.hstack(n)
# array([1,2,3,4,5,6])

当然,hstack还能嵌套操作

1
np.hstack(np.stack(n1))

3.ndarray的切分

语法: np.split(ary,(first_cut,second_cut),axis=0)

切两刀,将数组分为三份,可以通过索引获取
1
2
# 获取切片后的第二个数组
np.split(n,(1,3))[1]

同时也有水平和竖直切片: np.vsplit(n)np.hsplit(n)


ndarray的级联

语法: np.concatenate((n1,n2,...),axis=0)

说明:

  • 级联的参数是列表:一定要加中括号或小括号
  • 进行级联的矩阵维数必须相同,形状相符
  • 级联的方向默认是shape这个元组(tuple)的第一个值所代表的维度方向,而且可以通过axis属性修改级联方向
axis=0 则向行方向级联; axis=1 则向列方向级联
1
2
n1 = np.random.randint(0,10,size=(55))
np.concatenate((n1,n1))

nparray的聚合操作

求和

语法: np.sum()

最大最小值

语法: np.max()/np.min()

同时将最大最小值显示出来: display(img.max(), img.min())

参数:

  • axis
    • axis=0 :将ndarray中多个数组的每一个aij中最大值取出来,作为一个数组
    • axis=1 : 将ndarray中的每一个数组中每列的最大值放在相应位置
    • axis=2 : 将ndarray中的每一个数组中每行的最大值放在相应位置

平均值

将ndarray中所有数的平均值求出来

语法: np.mean(ndarray)

参数:

  • axis
    • axis=0 :将ndarray中多个数组的每一个aij中平均值取出来,作为一个数组
    • axis=1 : 将ndarray中的每一个数组中每列的平均值放在相应位置
    • axis=2 : 将ndarray中的每一个数组中每行的平均值放在相应位置

最大最小值的索引

语法: np.argmax()/argmin(ndarray)

另一用法:输出返回一定条件的元素索引

输出ndarray中所有值大于100的元素索引值

命令: np.argwhere(n>100)

示例:通过argwhere方法获取ndarray中元素大于100的值(通过索引获取)

1
2
3
n = np.random.randint(0,150, size = 5)
index = np.argwhere(n>100)
n[index]

ndarray的形状(类似矩阵的行列)

命令: n1.shape

如果是图片使用shape命令,则二图片将会转化为三维数组,长宽和最后一维是颜色

1
2
3
img = np.imread('xxx.jpg')
img.shape
# (1d,2d,3d)

显示ndarray

1
2
plt.imshow(ones)
plt.show

文件操作

1.使用pandas打开文件读取数据

1
2
import pandas as pd 
df = pd.read_csv('path')

2.打印文件数据

1
2
3
ndarray = df.values
type(ndarray)
# numpy ndarray

ndarray数值操作

加减乘除

1
2
3
4
import numpy as np
n = np.random.randint(0,10,size=(4,4))
n+10
n/3

加法运算: np.add()

1
2
# 每个元素值加二
np.add(n,2)

矩阵积运算: np.dot()

1
2
# 矩阵n1 乘积 n2
np.dot(n1,n2)

广播机制

ndarray广播机制的两条重要规则

  • 规则一: 为缺失的维度补加一
  • 规则二: 假定缺失元素用已有值填充

规则一实例:

1
2
3
4
5
6
7
m = np.ones((2,3))
n = np.arrange(3)
display(m,n)
# m为二维,而n为一维

# numpy的广播机制规则一即 维度不同的矩阵,维数不对应,会自动补全
m + n

ndarray的排序

冒泡排序

1
2
3
4
5
6
def sort(ndarray):
for i in range(ndarray.size):
for i in range(i, ndarray.size):
if ndarray[i] > ndarray[j]:
ndarray[i], ndarray[j] = ndarray[j], ndarray[i]
return ndarray

一层循环

1
2
3
4
5
6
7
# 降低运算的空间复杂度和时间复杂度
def sort(nd):
for i in range(nd.size):
# 切片操作会导致索引不对应,所以添加一个i
min_index = nd.argmin(nd[i:]) + i
nd[i], nd(min_index) = nd[min_index], nd[i]
return nd

快速排序

方法一: nd.sort()

1
2
3
# 使用nd.sort(),原来的数据会被改变,且不会占用新内存
nd.sort()
nd

方法二: numpy.sort(nd)

1
2
3
# numpy.sort(nd)不会改变原来的ndarray,占用新内存
n = np.sort(n1)
display(n)

部分排序

并不对所有数据感兴趣,而是分析最小或最大的一部分

语法: np.partition(nd, k)

  • k为正数时,返回最小的k个数;k为负数时,返回最大的k个数
1
2
3
4
5
nd = [3,5,2,1,4]
# 只对nd中最大的三个数进行排序
nd1 = np.partition(nd, -3)
nd1
# [2,1,3,4,5]

函数

np.random.rand()函数

作用: 通过本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1。


喜欢的可以对我小额打赏哦,鼓励小编推出更多优质内容~

本文标题:数据分析 - NumPy

文章作者:Keithx的博客~

发布时间:2018年08月11日 - 22:08

最后更新:2018年10月05日 - 23:10

原始链接:http://edmath.cn/机器学习-人工智能-NumPy.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%
;