欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python-data-analysis -----Numpy

程序员文章站 2022-05-18 20:59:04
...

python-data-analysis -----Numpy

简谈python数据分析之三大要点:

  1. Numpy:这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。
  2. Pandas:是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法
  3. Matplotlib:Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形

下面详细的介绍一下三大要点

  • 首先有俩个重要的命令运行,自动在浏览器启动

    打开windows终端:ipython    运行代码命令:%run python文件
    在windows终端输入:jupyter notebook(自动打开浏览器进行代码编写)
     在右边点击new,选择python3,新建书写代码区域,格式默认code;

  • Numpy
    1.ndarray, 一个有效的多维数组,能提供以数组为导向的快速数值计算和灵活的广播功能(broadcasting)

    属性:
    T,data,dtype,flags,flat,imag,real,size,itemsize,nbytes,ndim,shape,strides,ctypes,base等

1.data,dtype的用法
import numpy as np

data = np.random.randn(2, 3)
data
--->结果:
array([[-0.35512366, -0.63779545,  0.14137933],
       [ 0.36642056,  0.30898139, -0.87040292]])
data.dtype
--->结果:
dtype('float64')
2.ndim
data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1)
arr1
--->结果:
array([ 6. ,  7.5,  8. ,  0. ,  1. ])
//嵌套序列能被转换为多维数组
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr2 = np.array(data2)
arr2
--->结果:
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
//因为data2是一个list of lists, 所以arr2维度为2。我们能用ndim和shape属性来确认一下
arr2.ndim   -->2
arr2.shape  -->(2,4)

2.用于读取/写入(reading/writing)数据到磁盘的便利工具

import numpy as np

arr = np.arange(10)
//数组会以未压缩的原始二进制模式被保存,后缀为.npy
np.save('../examples/some_array', arr)

//即使保存的时候没有加后缀,也会被自动加上。可以用np.load来加载数组
np.load('../examples/some_array.npy')
--->结果:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

//用np.savez能保存多个数组,还可以指定数组对应的关键字,不过是未压缩的npz格式
np.savez('../examples/array_archive.npz', a=arr, b=arr)

//加载.npz文件的时候,得到一个dict object
arch = np.load('../examples/array_archive.npz')
arch['b']
--->array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

//可以用np.savez_compressed来压缩文件
np.savez_compressed('../examples/array_compressed.npz', a=arr, b=arr)

效果图:
python-data-analysis -----Numpy
3.线性代数,随机数生成,傅里叶变换能力

在MATLAB里,`*` 代表矩阵乘法。但是在numpy里,`*`表示element-wise prodct。要想做到矩阵乘法,要用多函数dot

import numpy as np

x = np.array([[1., 2., 3.], [4., 5., 6.]])
y = np.array([[6., 23.], [-1, 7], [8, 9]])
//打印x,y
x,y
--->结果:
(array([[1., 2., 3.],
        [4., 5., 6.]]),
        array([[ 6., 23.],
        [-1.,  7.],
        [ 8.,  9.]]))

//x.dot(y)等同于np.dot(x, y):
   x.dot(y)
--->结果:
array([[  28.,   64.],
       [  67.,  181.]])
//这里是用了boradcasting,x中的每一行与[1, 1, 1]点对点乘积后求和,等同于x @ np.ones(3)
np.dot(x, np.ones(3))  
--->结果:
array([  6.,  15.])

//np.linalg能用来做矩阵分解,以及比如转置和求秩之类的事情
from numpy.linalg import inv, qr

X = np.random.randn(5, 5)
X
--->结果:
array([[ 0.0761557 , -0.34138565, -0.56325926,  1.7854    ,  1.23440008],
       [ 1.46787829,  1.73130465,  1.03519282,  1.11137573, -0.05928319],
       [-0.95508009, -1.35350494, -1.43415583, -0.28499706,  0.32739284],
       [ 0.83307271,  1.89349058,  0.94116452,  0.32347353,  0.22236912],
       [-1.20661273,  0.4531822 ,  0.47635565, -1.69312137, -0.34497803]])

mat = X.T.dot(X)
np.round(mat, 2)
-->结果:
array([[ 5.22,  4.84,  3.06,  4.35,  0.3 ],
       [ 4.84,  8.74,  5.92,  1.55, -0.7 ],
       [ 3.06,  5.92,  4.56,  0.05, -1.18],
       [ 4.35,  1.55,  0.05,  7.48,  2.7 ],
       [ 0.3 , -0.7 , -1.18,  2.7 ,  1.8 ]])
 np.round(inv(mat), 2)
 -->结果:
 array([[ 12.14,  -6.15,   3.85, -11.22,  14.95],
       [ -6.15,   4.85,  -4.47,   5.7 ,  -8.57],
       [  3.85,  -4.47,   5.23,  -3.78,   6.71],
       [-11.22,   5.7 ,  -3.78,  10.77, -14.55],
       [ 14.95,  -8.57,   6.71, -14.55,  20.95]])
 np.round(mat.dot(inv(mat)), 2)
 --->结果:
 array([[ 1.,  0.,  0.,  0., -0.],
       [-0.,  1.,  0., -0., -0.],
       [ 0., -0.,  1., -0.,  0.],
       [-0.,  0.,  0.,  1.,  0.],
       [ 0.,  0., -0.,  0.,  1.]])
  q, r = qr(mat)
  np.round(r, 2)
  --->结果:
  array([[ -8.89, -10.37,  -6.57,  -7.16,  -0.77],
       [  0.  ,  -5.5 ,  -4.79,   5.41,   3.04],
       [  0.  ,   0.  ,  -0.71,   1.85,   1.54],
       [  0.  ,   0.  ,   0.  ,  -0.75,  -0.53],
       [  0.  ,   0.  ,   0.  ,   0.  ,   0.03]])

举个栗子:
假设我们一次要模拟5000个随机漫步。传入一个2-tuple,np.random会生成一个二维数组,然后我们沿着每行来计算累加,这样就能一次模拟5000个

nwalks = 5000
nsteps = 1000
draws = np.random.randint(0, 2, size=(nwalks, nsteps)) # 0 or 1
steps = np.where(draws > 0, 1, -1)
walks = steps.cumsum(1)

walks
--->结果:
array([[ -1,   0,  -1, ...,  34,  35,  34],
       [ -1,  -2,  -3, ..., -30, -31, -30],
       [ -1,  -2,  -1, ...,  -4,  -5,  -4],
       ...,
       [  1,   2,   1, ...,  18,  19,  20],
       [  1,   2,   3, ..., -20, -21, -22],
       [  1,   0,  -1, ...,  40,  39,  40]], dtype=int32)
//在这些漫步模拟中,我们想找到30步以上的,用any方法
hits30 = (np.abs(walks) >= 30).any(1)
hits30
--->
array([ True,  True, False, ...,  True,  True,  True])
hits30.sum()
--->结果:
3337
//上面的step只是像翻硬币一样二选一,我们也可以用一个概率函数来生成:
steps = np.random.normal(loc=0, scale=0.25, size=(nwalks, nsteps))
plt.plot(walk[:100])
[<matplotlib.lines.Line2D at 0x1a93ae3d860>]

python-data-analysis -----Numpy

后续中….

路过的大神们关注个公众号呗~
python-data-analysis -----Numpy

相关标签: numpy random