让我们谈谈 NumPy——面向数据科学初学者

什么是Numpy?

Numpy 用于在数组中履行数学和逻辑运算。运用 NumPy 的首要意图是提高内存功率,它能够管理任何维度的很多数据。Numpy 用于履行数组和矩阵运算。

Numpy 能够履行矩阵运算、三角函数、线性代数、计算等等。

Numpy ndarray 供给多维数组对象。

Numpy中的数组有哪些类型?

让我们谈谈 NumPy——面向数据科学初学者


标量 – 它只要单个元素0D

向量 – 它有 n 个元素,可是,元素应该是行或列(简略地总结元素列表)1D

矩阵 – 矩阵在2D行和列中保存值

Tensor-Tensor 有 n 维的行和列元素。

如何安装Numpy

运用 pip 安装 NumPy 包

pip install numpy

Pandas 和 Numpy 相得益彰,是两个最重要的 Python 库,假如你想了解Pandas,请查看我之前的Pandas文章:Python每日一库之Pandas

最重要的 Numpy 数据类型是什么?

  • 一维数组

最重要的对象之一是称为 ndarray 的 N 维数组类型。

咱们能够将一维数组视为具有一个或多个元素的表的一列或一行:

让我们谈谈 NumPy——面向数据科学初学者

存储在 ndarray 中的一切项目都必须是同一类型。这意味着 ndarray 是一个同质数据块。ndarray 有跨步信息。该数值是维度中下一个元素的字节数。

这有助于数组在内存中导航,而且不需要仿制数据。

每个 ndarray 都包括一个指向其在计算机中的内存方位的指针。它还包括它的 dtype、它的形状和步幅元组。步幅是整数,表明它必须移动的字节数才能抵达维度中的下一个元素。

数组包括相同类型的对象的集合,例如整数

要创立一个数组:

import numpy as np
a = np.array([1,2,3])
  • 多维数组

多维数组有不止一列。

咱们能够将多维数组视为 Excel 电子表格——它具有列和行。每一列都能够被视为一个维度。

让我们谈谈 NumPy——面向数据科学初学者

咱们能够实例化一个数组对象:

numpy.array([,.,.,.,])
numpy.array([1,2]) #1D 
numpy.array([[1,2],[10,20]]) #2D#关于杂乱类型
numpy.array([1,2], dtype=complex) #1D complex

假如要创立 3D 数组:

  • 这将创立 3 个具有 4 行和 5 列的数组,每个数组具有随机整数。
3DArray = np.random.randint(10, size=(3, 4, 5))

还有其他类型可用,例如:

  1. 布尔值
  2. 整数(有符号和无符号)
  3. 浮点数
  4. 杂乱的

何时运用数组

就像数组数据结构一样,Python 中的列表也是一种数据结构,列表是可变的,而且是有序的元素序列。它很灵活,能够保存恣意数据。此外,咱们能够有效地将项目附加到列表中。可是,列表比数组占用更多空间,数组是 C语言数组的封装。假如要履行数学运算,则应运用 Numpy 数组。此外,咱们能够在数组上履行咱们无法在列表上履行的算术函数。

创立数组的不同办法

  • 假如要创立没有任何元素的数组
numpy.empty(2) #这将创立 2 个元素的一维数组
numpy.empty([2,3]) #这将创立二维数组(2 行,每列 3 列)
  • 假如要创立一个0s的数组
numpy.zeros(2) #它将创立一个有2个元素的一维数组,都是0
#注意办法的参数是shape,它能够是int或tuple
  • 假如要创立一个1s的数组
numpy.ones(2) # 这将创立具有 2 个元素的一维数组,均为 1
  • 假如你想从一个元素序列创立一个numpy数组
numpy.asarray([python sequence]) #e.g. numpy.asarray([1,2])
  • 从内存中的缓冲区创立numpy数组
#能够在内存中仿制字符串
x = np.fromstring(‘hi’, dtype=’int8')
#直接引证字符串的缓冲区,这样能够节约内存,能够传入dtype参数,默许是float
a = np.frombuffer(x, dtype=’int8')
  • 假如要创立一系列元素
array = np.arange(3) #array 将包括 0,1,2
  • 假如要创立一个具有均匀分布的值的数组
#numpy.arange(first, last, step, type)
numpy.arange(0,6,2) # 回来[0,2,4]
  • 假如要创立一个数组,其间值在一个区间之间呈线性距离
#numpy.linspace(first, last, number)
numpy.linspace(0,10,5)  # 回来[0,2.5,5,7.5,10]
  • 假如要创立一个数组,其间值在一个距离之间以对数距离
#numpy.logspace(first, end, number)
a= numpy.logspace(1, 15, 4)
#[1.00000000e+01 4.64158883e+05 2.15443469e+10 1.00000000e+15]
  • 随机数生成
np.random.rand(3,2) #3行,2

添加/删去/排序元素

  • 添加元素
a = [0]
np.append(a, [1,2]) #adds 1,2 at the end 
# [0,1,2]
  • 删去元素
# np.delete(array, 1) 从数组中删去元素1
a = np.delete([0,1,2], 1) #results in [0,2]
  • 元素排序

对数组进行排序,请调用 sort(array, axis, kind, orderby) 函数

# np.sort(array1, axis=1, kind = 'quicksort')
a = np.sort([[0,3,2],[1,2,3]], axis=1, kind = 'quicksort' )
#[[0 2 3] 
# [1 2 3]]

NumPy 数组函数和特点

  • shape:查找数组的维度(列数/行数)
#array = np.array([[..],[..]]) 
#print(array.shape)
a = np.array([[1,2],[3,4]])
print(a.shape)
# (2,2) # 行、列
#能够经过设置 shape 特点来改动数组的形状(调整巨细)
array.shape = (1,2) #1 行 2 列
#假如想在不仿制任何数据的情况下更改数组的形状,能够运用reshape()办法
array = np.arange(10) 
array.reshape(2,5) #这将回来一个2行5列的数组
#还能够将维度值设置为 -1,这将让 Numpy 从数据中推断出维度
#想展平一个数组而不回来一个副本,咱们能够运用 ravel() 函数
array.ravel() # 这会将上面的数组重塑为1d的10个元素
#咱们想展平一个数组并生成一个副本,那么咱们能够运用 flatten() 办法
a = array.flatten() #这将回来一个一维数组
  • 假如咱们要求一个数组的维度
a = np.array([[1,2],[3,4]])
print(a.ndim)
  • 假如咱们要求一个数组每个元素的长度
a = np.array([0,1,2]).itemsize
print(a)
  • 假如咱们想要对数组的一个子集进行切片
array = np.arange(100)
#获取第三个元素:
array[2] #prints 2
#获取索引中的项目
array[3:5] #3 是开端,5 是结束, prints [3 4]
#获取3-10个元素,步长是4:
array[2:9:4] #prints [2 6]
#从第二个元素开端获取一切元素
array[1:] #prints [1-99]
#也能够传入N维索引
array = np.array([[0,1,3],[1,2,4]])
print(array[[0,1],[1,2]]) #prints [1 4]
  • 数组切片中的条件
#获取一切 NAN 元素
array[np.isnan(array)]
#where()可用于传入布尔表达式
np.where(array > 2) # 将回来一切契合条件的元素
  • 播送数组
#当对两个不同巨细的数组履行数学运算时,较小的数组被播送到较大数组的巨细
large_array = np.arange(15).reshape(5,3) #5 行 3 列数组
small_array = np.arange(5).reshape(5,1) #5 行 1 列数组
final_array = small_array * large_array 
print (final_array)

需要注意的要害是播送兼容两个数组,其间第一个数组的列数与第二个数组的行数相同,或者任何数组的长度为 1。

  • 衔接数组
a = [1,2]
b= [3,4] 
c = [a,b] 
#输出:[[1, 2], [3, 4]]
np.concatenate(c) 
#输出:[1 2 3 4]
np.stack(c) #
#输出:
#[[1 2] 
#[3 4]]
# 能够运用 vstack 或 hstach 办法将它们堆叠起来
np.hstack(c) #
#输出:
#[1 2 3 4]
np.vstack(c) #
#输出:
#[[1 2] 
#[3 4]]
  • 字符串操作

能够运用字符串的操作,比方添加,大写,小写,替换等。

add(), upper(), lower(), replace()
  • 创立 numpy 数组的深拷贝
new_array = np.copy(array)

要重复一个数组,咱们能够运用 repeat() 或 tile() 函数。repeat(n) 将简略地重复每个元素 n 次。n 也能够是一个数组,其间每个元素将根据 n 的值以不同的方式重复,例如 [1,5] 意味着咱们需要重复第一个元素一次,第二个元素重复 5 次。关于多维数组,咱们能够传入axis特点。tile(array, (n,m)) 略有不同,由于除了重复元素之外,它还对 n 行和 m 列的项目进行平铺/堆叠。

  • 自定义数组函数

运用 np.fromnpfunc(my_new_ufunc, elements) 创立新的 func,然后在 NumPy 数组上履行它

  • 结构化数组

咱们想创立一个包括多种数据类型元素的数组,那么咱们能够创立一个结构化数组。咱们能够设置 dtype,它是一个包括元素名称和类型的元组列表。结构化数组比 pandas DataFrame 更快,由于它们耗费更少的内存,由于每个元素都表明为固定数量的字节,它们是精简的,因此是高效的初级数组,也能够被视为表格结构。

type = [('column_1', np.int32, 'column_2', np.float64])
array = np.array([1,2], [2.4, -1], dtype=type)
  • 数学函数

Numpy 供给了一系列强壮的数学函数,由于 Numpy 具有丰厚的数学特性,因此在 Numpy 之上构建了许多库

#加、减、乘、除、幂、模
#要对两个数组 a 和 b 履行基本算术函数:
a = [1,2] 
b= [3,4] 
c = np.add(a, b) 
c = np.subtract(a, b) 
c = np.multiply(a, b) 
c = np.divide( a, b) 
c = np.power(a, b) 
c = np.power(a, 2) 
#得到余数
c= np.mod(a, b) 
c = np.remainder(a, b)
#四舍五入,ceiling向上取整,floor向下取整
#要更改数组一切元素的精度:
np.around(array, 4) # 4dp 
np.ceil(array) #1.8 会变成 2 
np.floor(array) #1.8 会变成 1
  • 三角函数
array = [0, 1]
np.sin(array) 
np.cos(array) 
np.tan(array) 
np.arcsin(array) 
np.arccos(array) 
np.arctan(array)
  • 计算
a = [1,2]
np.amin(a, 0) #min in the axis
np.amax(a, 0) #max in the axis
np.percentile(a, 10)
np.median(a)
np.std(a)
np.average(a)
np.mean(a)
np.var(a)
  • 代数

Numpy 包括一个称为 linalg 的模块。它具有许多代数函数

1. dot() #两个数组的点积
2. inner() #两个数组的内积
3. 行列式() #一个数组的行列式
4.solve() #求解矩阵方程
5. inv() #逆矩阵
6. matmul() #两个数组的矩阵乘积

关于 Numba 的注意事项

咱们能够运用 Numba 为 Numpy 创立快速函数。Numba 函数本质上是纯 Python 函数。诀窍是运用 nb.jit(func) 将函数编译成更快的 Numba 版本。咱们还能够在函数上运用 @numba.vectorize 装饰器将代码编译成 NumPy ufunc。虽然 Numba 不支持一切 Python 代码,但它能够处理大部分用纯 Python 编写的数值算法。

归纳

本文概述了 NumPy 库的中心功用。自从 2005 年 NumPy 与 Numarray 的功用相结合以来,它现已获得了巨大的普及,并被认为是运用的要害 Python 库之一。

文章概述了 NumPy 数组的要害功用和特点,感谢阅览,Happy Code!