Python Numpy 简介

2018-10-09 Tuesday     program , linux

NumPy 是 Python 的一个扩充程序库,支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。内部解除了 Python 的 PIL (全局解释器锁),同时使用 C/C++ 做扩展,运算效率极好,是大量机器学习框架的基础库。

NDArray

这是一个多维数组对象,该对象由 实际数据元数据 组成,其中大部分操作仅仅修改元数据部分,而不改变底层的实际数据。

注意,实际的数据必须要保证是同质的。

import numpy as np

#----- 一维 通过Python队列初始化
np.array([0, 1, 2, 3, 4])
#----- 一维 使用arange()函数
np.arange(5)
np.arange(0, 5)

#----- 多维 通过shape属性查看维度
arr = np.array([[0, 1, 2], [3, 4, 5]])
arr = np.array([np.arange(0, 3), np.arange(3, 6)])
arr.shape

#----- 修改维度
arr.shape = 3, 2
arr = arr.reshape(3, 2)

#----- 数组展开,前者只是展示格式不同,而后者会申请内存
arr.ravel()
arr.flatten()

#----- 转置矩阵
arr = np.arange(6).reshape(2, 3)
arr.transpose()

#----- 其它
arr = np.arange(6).reshape(2, 3)
arr.dtype     # 类型
arr.shape     # 维度(行, 列)
arr.ndim      # 行
arr.size      # 总大小,也就是 行*列
arr.itemsize  # 单个元素的大小
arr.data      # 真正的数据信息,包括地址、元素个数等

随机数

这一模块用于生成随机数,包含了一系列的函数。

rand()

numpy.random.rand(d0, d1, ..., dn)

生成范围是 [0, 1) 的数据,数据是均匀分布,其中 dN 代表了维度,例如 rand(4, 2) 生成 4 行 2 列的数据。

randn()

numpy.random.randn(d0, d1, ..., dn)

rand() 函数类似,只是生成的为正态分布。

uniform()

numpy.random.uniform(low=0.0, high=1.0, size=None)

用于生成均匀分布 (uniform distribution) 的随机数,其中 size 可以是数值或者元组。

RandomState

其入参可以是 int array None ,与 seed() 函数类似,其中 RandomState() 是线程安全的,相比来说更为复杂,可以替换 rand() 函数。

使用 RandomState() 获得随机数生成器时,只要种子相同那么最终生成的序列也就是相同的,一般的使用方法如下:

import numpy as np

for i in xrange(4):
    rnd = np.random.RandomState(1)
    print rnd.uniform(0, 1, (2, 3))

正态随机值

numpy.random.normal(loc=0.0, scale=1.0, size=None)

生成一个符合正态分布的随机序列,详细可以参考 docs.scipy.org 中的介绍。

import numpy
import matplotlib.pyplot as plt

mean = 0
sigma = 1
arr = numpy.random.normal(mean, sigma, size=1000)
abs(mean - np.mean(s)) < 0.01
abs(sigma - np.std(s, ddof = 1)) < 0.01

plt.plot(arr)
plt.show()

常用技巧

linspace()

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

在指定的范围内生成间隔均匀的数字,开始值、终值和元素个数创建表示等差数列的一维数组,可以通过 endpoint 参数指定是否包含终值,默认值为 True,即包含终值。

与之类似的是 arange() 函数,不过该函数不含终止值。

meshgrid()

简单来说,就是生成网格,最常用的是将在两个坐标轴上的点在平面上画网格,如下是一个简单的示例:

import numpy as np
import matplotlib.pyplot as plt

X, Y = np.meshgrid(np.linspace(0, 1, 5), np.linspace(0, 1, 3))
plt.plot(X, Y, marker='.', color='blue', linestyle='none')
plt.show()

这在很多的示例中会使用,后面再详细介绍。

histogram()

用来统计一个数组的直方库,也可以使用 plt.hit() 函数直接绘制一个图。

import numpy as np
import matplotlib.pyplot as plt
   
arr = np.array([22, 87, 5, 43, 56, 73, 55, 54, 11, 20, 51, 5, 79, 31, 27])
hist, bins = np.histogram(arr, bins = [0, 20, 40, 60, 80, 100])

plt.hist(arr, bins = [0, 20, 40, 60, 80, 100])
plt.title("histogram")
plt.show()

cumsum()

cumsum() 函数用于计算累加,可以有如下的几种方式。

import numpy as np

# 1 2
# 2 3
a = np.cumsum([[1, 2], [2, 3]])
print(a)   #[1 3 5 8] 由前面的值依次累加

b = np.cumsum([[1, 2], [2, 3]], axis=0)
print(b)   # [[1 2] [3 5]] 每列累加

c = np.cumsum([[1,2],[2,3]],axis=1)
print(c)   # [[1 3] [2 5]] 每行累加


如果喜欢这里的文章,而且又不差钱的话,欢迎打赏个早餐 ^_^


About This Blog

Recent Posts

Categories

Related Links

  • RTEMS
    RTEMS
  • GNU
  • Linux Kernel
  • Arduino

Search


This Site was built by Jin Yang, generated with Jekyll, and hosted on GitHub Pages
©2013-2019 – Jin Yang