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就只能通过寻址方式找到下一个元素,这虽然导致了在通用性能方面Numpyndarray不及Python原生list,但在科学计算中,Numpyndarray就可以省略掉很多循环语句,代码使用方面比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 关于arrayasarray的不同
>>> 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:要生成的等间隔样例数量,默认值50
    • endpoint:序列中是否包含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()

在这里插入图片描述

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐