Numpy
1 Numpy
优势
1.1 Numpy
介绍
Numpy(Numerical Python)
是一个开源的Python
科学计算库,用于快速处理任意维度的数组。
Numpy
支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy
比直接使用Python
要简洁的多。
Numpy
使用ndarray
对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
1.2 ndarray
介绍
NumPy
提供了一个N维数组类型ndarray
,它描述了相同类型的“items”
的集合。
1.3 ndarray
优势
1.3.1 内存块风格
ndarray
在存储数据的时候,数据与数据的地址都是连续的,这样就使得批量操作数组元素时速度更快。
在ndarray
中的所有元素的类型都是相同的,而Python
列表中的元素类型是任意的,所以ndarray
在存储元素时内存可以连续,而Python
原生list
就只能通过寻址方式找到下一个元素,这虽然导致了在通用性能方面Numpy
的ndarray
不及Python
原生list
,但在科学计算中,Numpy
的ndarray
就可以省略掉很多循环语句,代码使用方面比Python
原生list
简单的多。
1.3.2 ndarray
支持并行化运算(向量化运算)
Numpy
内置了并行运算功能,当系统有多个核心时,做某种计算时,Numpy
会自动做并行计算。
1.3.3 效率远高于纯Python
代码
Numpy
底层使用C
语言编写,内部接触了CIL
(全局解释器),对其数组的操作速度不受Python
解释器的限制,所以,其效率远高于纯Python
代码。
2 N维数组——ndarray
2.1 ndarray
的属性
数组属性反映了数组本身固有的信息。
属性名字 | 属性解释 |
---|---|
ndarray.shape | 数组维度的元组 |
ndarray.ndim | 数组维数 |
ndarray.size | 数组中的元素数量 |
ndarray.itemsize | 一个数组元素的长度(字节) |
ndarray.dtype | 数组元素的类型 |
>>> score = np.array(
[[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])
>>> score
array([[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])
>>> score.shape
(8, 5)
>>> score.ndim
2
>>> score.size
40
>>> score.itemsize
4
>>> score.dtype
dtype('int32')
2.2 ndarray
的形状
首先创建一些数组。
# 创建不同形状的数组
>>> a = np.array([[1,2,3],[4,5,6]]) # 二维数组
>>> b = np.array([1,2,3,4]) # 一维数组
>>> c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]]) # 三维数组
分别打印出形状
>>> a.shape
>>> b.shape
>>> c.shape
(2, 3) # 二维数组,两行三列
(4,) # 一维数组
(2, 2, 3) # 三维数组,最外层有两个二维数组,在二维数组中有两个一维数组,一维数组中有三个元素
2.3 nsarray
的类型
>>> type(score.dtype)
<type 'numpy.dtype'>
名称 | 描述 | 简写 |
---|---|---|
np.bool | 用一个字节储存的布尔类型(True或False) | ‘b’ |
np.int8 | 一个字节大小,-128至127 | ‘i’ |
np.int16 | 整数,-32768至32767 | ‘i2’ |
np.int32 | 整数,-231至232-1 | ‘i4’ |
np.int64 | 整数,-263至263-1 | ‘i8’ |
np.uint8 | 无符号整数,0至255 | ‘u’ |
np.uint16 | 无符号整数,0 至 65535 | ‘u2’ |
np.uint32 | 无符号整数,0 至 2^32 - 1 | ‘u4’ |
np.uint64 | 无符号整数,0 至 2^64 - 1 | ‘u8’ |
np.float16 | 半精度浮点数:16位,正负号1位,指数5位,精度10位 | ‘f2’ |
np.float32 | 单精度浮点数:32位,正负号1位,指数8位,精度23位 | ‘f4’ |
np.float64 | 双精度浮点数:64位,正负号1位,指数11位,精度52位 | ‘f8’ |
np.complex64 | 复数,分别用两个32位浮点数表示实部和虚部 | ‘c8’ |
np.complex128 | 复数,分别用两个64位浮点数表示实部和虚部 | ‘c16’ |
np.object_ | python对象 | ‘O’ |
np.string_ | 字符串 | ‘S’ |
np.unicode_ | unicode类型 | ‘U’ |
创建数组时指定类型
>>> a = np.array([[1, 2, 3],[4, 5, 6]], dtype=np.float32)
>>> a.dtype
dtype('float32')
>>> arr = np.array(['python', 'tensorflow', 'scikit-learn', 'numpy'], dtype = np.string_)
>>> arr
array([b'python', b'tensorflow', b'scikit-learn', b'numpy'], dtype='|S12')
3 基本操作
3.1 生成数组的方法
3.1.1 生成数组0和1的数组
np.ones(shape, dtype)
np.ones_like(a, dtype)
np.zeros(shape, dtype)
np.zeros_like(a, like)
ones = np.ones([4,8])
ones
返回结果:
array([[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.]])
np.zeros_like(ones)
返回结果:
array([[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.]])
3.2 从现有数组生成
3.2.1 生成方式
np.array(object, dtype)
np.asarray(a, dtype)
3.2.2 关于array
和asarray
的不同
>>> a = np.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>> a1 = np.array(a) # 深拷贝
>>> a1
array([[1, 2, 3],
[4, 5, 6]])
>>> a2 = np.asarray(a) # 浅拷贝
>>> a2
array([[1, 2, 3],
[4, 5, 6]])
>>> a[0,0] = 100
>>> a
array([[100, 2, 3],
[ 4, 5, 6]])
>>> a1
array([[1, 2, 3],
[4, 5, 6]])
>>> a2
array([[100, 2, 3],
[ 4, 5, 6]])
3.3 生成固定范围的数组
3.3.1 np.linspace(start, stop, num, endpoint)
- 创建等差数组——指定数量
- 参数
start
:序列的起始值stop
:序列的终止值num
:要生成的等间隔样例数量,默认值50endpoint
:序列中是否包含stop
值,默认true
# 生成等间隔的数组
np.linspace(0, 100, 11)
返回结果
array([0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.])
3.3.2 np.arange(start, stop, dtype)
- 创建等差数组——指定步长
- 参数
step
:步长,默认值为1
np.arange(10, 50, 2)
返回结果:
array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
44, 46, 48])
3.3.3 np.logspace(start, stop, num)
- 创建等比数列
- 参数:
num
:要生成的等比数列数量,默认50
# 生成10^x
np.logspace(0, 2, 3)
返回结果:
array([ 1., 10., 100.])
4 生成随机数组
4.1 正态分布
正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参 数σ是此随机变量的标准差,所以正态分布记作N(μ,σ )。
μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。
正泰分布创建方式
-
np.random.randn(d0, d1, …, dn)
功能:从标准正态分布中返回一个或多个样本值
-
np.random.normal(loc=0.0, scale=1.0, size=None)
loc:float
此概率分布的均值(对应着整个分布的中心centre)
scale:float
此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints
输出的shape,默认为None,只输出一个值
-
np.random.standard_normal(size=None)
返回指定形状的标准正态分布的数组。
# 生成均值为1.75,标准差为1的正态分布数据,100000000个
x1 = np.random.normal(1.75, 1, 100000000)
返回结果:
array([2.90646763, 1.46737886, 2.21799024, ..., 1.56047411, 1.87969135, 0.9028096 ])
# 生成均匀分布的随机数
x1 = np.random.normal(1.75, 1, 100000000)
# 画图看分布状况
# 1)创建画布
plt.figure(figsize=(20, 10), dpi=100)
# 2)绘制直方图
plt.hist(x1, 1000)
# 3)显示图像
plt.show()
4.2 均匀分布
-
np.random.rand(d0, d1, …, dn)
返回[0.0,1.0)内的一组均匀分布的数。
-
np.random.uniform(low=0.0, high=1.0, size=None)
功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.
参数:
- low: 采样下界,float类型,默认值为0;
- high: 采样上界,float类型,默认值为1;
- size: 输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出mnk个样本,缺省时输出1个值。
- 返回值:ndarray类型,其形状和参数size中描述一致。
-
np.random.randint(low, high=None, size=None, dtype=‘l’)
从一个均匀分布中随机采样,生成一个整数或N维整数数组,
取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
# 生成均匀分布的随机数
x2 = np.random.uniform(-1, 1, 100000000)
返回结果:
array([ 0.22411206, 0.31414671, 0.85655613, ..., -0.92972446, 0.95985223, 0.23197723])
# 生成均匀分布的随机数
x2 = np.random.uniform(-1, 1, 100000000)
# 画图看分布状况
# 1)创建画布
plt.figure(figsize=(10, 10), dpi=100)
# 2)绘制直方图
plt.hist(x=x2, bins=1000) # x代表要使用的数据,bins表示要划分区间数
# 3)显示图像
plt.show()