原文链接:https://blog.csdn.net/qq_38328378/article/details/80833115
原文作者:Is秦
Numpy(Numerical Python的简称)是一个由多维数组对象和用于处理数组的例程集合组成的库。
Numpy内部解除了Python的PIL(全局解释器锁),运算效率极好,是大量机器学习框架的基础库!
其部分功能如下:
①ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
②用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
③用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
④线性代数、随机数生成以及傅里叶变换功能。
⑤用于集成由C、C++、Fortran等语言编写的代码的工具。
NumPy的安装
直接安装
在cmd中进入到 python的安装目录下的scripts文件夹中,执行下面的命令:
pip install numpy
离线安装
1、打开网址https://pypi.org/project/numpy/,找到安装的python版本对应的numpy版本。
2、将numpy下载到 python的安装目录下的scripts文件夹中;
3、然后在cmd中执行以下命令:
pip install numpy-1.14.5-cp36-none-win_amd64.whl
ndarray多维数组
简介
NumPy最重要的一个特点就是其N维数组对象(即ndarray),该对象是一个快速而灵活的大数据集容器。
ndarray是一个通用的同构数据容器,也就是说,其中的所有元素必须是相同类型的。
每个数组都有一个shape(一个表示各维度大小的元组)和一个dtype(一个用于说明数组数据类型的对象)
date.shape data.dtype
创建ndarray
创建数组最简单的办法就是使用array函数。它接受一切序列的对象(包括其他的数组),然后产生一个新的含有传入数据的NumPy数组。
嵌套序列(比如由一组等长列表组成的列表)将会被转换为一个多维数组。
函数 | 描述 |
---|---|
array | 将输入数据(列表、元组、数据或其他序列类型)转换为ndarray;默认直接复制输入数据; |
asarray | 将输入转换为ndarray,如果输入本身就是一个ndarray就不进行复制; |
arange | 类似内置range,但返回的是一个ndarray而不是列表; |
ones、ones_like | 前者根据指定的形状和dtype创建一个全1数组,后者以另一个数组为参数,并创建一个全1数组; |
zeros、zeros_like | 类似于ones和ones_like,产生的是全0数组; |
empty、empty_like | 创建新数组,只分配内存空间但不填充任何值; |
eye、identity | 创建一个正方的N * N 单位矩阵(对角线为1,其他为0); |
ndarray的数据类型
dtype(数据类型)是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息。
dtype是NumPy如此强大和灵活的原因之一。多数情况下,它们直接映射到相应的机器表示,这使得“读写磁盘上的二进制数据流”以及“集成低级语言代码(如C、Fortran)”等工作变得更加简单。
数值型dtype的命名方式相同:一个类型名(如float或int),后面跟一个用于表示各元素位长的数字。
标准的双精度浮点值(即Python中的float对象)需要占用8字节(即64位)。因此,该类型在NumPy中就记作float64。
用data.dtype()来显示数据类型
下图列示了NumPy所支持的全部数据类型:
类型 | 描述 |
---|---|
bool | 用一位存储的布尔类型(值为TRUE或FALSE) |
inti | 由所在平台决定其精度的整数(一般为int32或int64) |
int8 | 整数,范围为 -128 至 127 |
int16 | 整数,范围为 -32 768 至 32 767 |
int32 | 整数,范围为 -231 至 231 - 1 |
int64 | 整数,范围为 -263 至 263 - 1 |
uint8 | 无符号整数,范围为 0 至 255 |
uint16 | 无符号整数,范围为 0 至 65 535 |
uint32 | 无符号整数,范围为 0 至232 - 1 |
uint64 | 无符号整数,范围为 0至 264 - 1 |
float16 | 半精度浮点数(16位):其中用1位表示正负号,5位表示指数,10位表示尾数 |
float32 | 单精度浮点数(32位):其中用1位表示正负号,8位表示指数,23位表示尾数 |
float64或float | 双精度浮点数(64位):其中用1位表示正负号,11位表示指数,52位表示尾数 |
complex64 | 复数,分别用两个32位浮点数表示实部和虚部 |
complex128或complex | 复数,分别用两个64位浮点数表示实部和虚部 |
实现代码
-
import numpy
as np
-
data1 = [
6,
7.5,
8,
0,
1]
#创建列表
-
arr1 = np.array(data1)
#转换为数组
-
print(arr1)
-
print(arr1.dtype)
#数据类型保存在dtype对象中
-
-
data2 = [[
1,
2,
3,
4],[
5,
6,
7,
8]]
#创建嵌套序列(由等长列表组成的列表)
-
arr2 = np.array(data2)
#转换为多维数组
-
print(arr2)
-
print(arr1.dtype)
-
print(arr1.shape)
-
-
print(np.zeros(
10))
#创建指定长度(10)的全0数组
-
print(np.ones(
2,
4))
#创建指定长度的(2行4列二维)的全1数组
-
print(np.empty((
2,
3,
2)))
#创建指定长度的(2行3列2层的三维)的随机数数组
NumPy常用函数
1、统计方法
sum、mean、std等聚合计算,这类函数可以接受一个axis参数(用于计算该轴向上的统计值);
-
arr = np.random.randn(
5,
4)
-
>> arr.mean()
-
0.062814911084854597
-
>> np.mean(arr)
-
0.062814911084854597
-
>> arr.mean(axis =
1)
-
array([
-1.2833,
0.2844,
0.6574,
0.06743,
-0.0187])
-
>> arr.sum(
0)
-
array([
-3.1003,
-1.6189,
1.4044,
4.5712])
cumsum和cumprod之类的方法则不聚合,而是产生一个由中间结果组成的数组;
-
arr = np.array([[
0,
1,
2], [
3,
4,
5], [
6,
7,
8]])
-
# 传入的0,1参数为axis 表示累乘累和的轴
-
>> arr.cumsum(
0)
-
array([[
0,
1,
2],
-
[
3,
5,
7],
-
[
9,
12,
15]])
-
>> arr.cumprod(
1)
-
array([[
0,
0,
0],
-
[
3,
12,
60],
-
[
6,
42,
336]])
基本数组统计方法:
函数 | 说明 |
---|---|
sum | 对数组中全部或某轴向的元素。零长度的数组sum为0 |
mean | 算数平均数。零长度的数组mean为nan |
std、var | 标准差、方差 |
min、max | 最大值、最小值 |
argmin、argmax | 最大和最小元素的索引 |
cumsum、cumprod | 累计和、累计积 |
2、排序
NumPy数组可通过sort方法直接排序,对于多维数组可在任何一个轴上进行排序,只需传入轴编号;
计算数组分位数,只需先排序,再选特定位置的值;
-
arr = randn(
100)
-
arr.sort()
-
arr[int(
0.05*len(arr))]
# 计算5%分位数
3、唯一化和其他的集合逻辑
函数 | 说明 |
---|---|
unique(x) | 计算x中的唯一元素,并返回有序结果 |
intersect1d(x, y) | 计算x和y的公共元素,并返回有序结果 |
union1d(x, y) | 计算x和y的并集,并返回有序结果 |
in1d(x, y) | 得到一个表示x的元素是否包含于y的布尔型数组 |
setdiff1d(x, y) | 集合的差,即元素在x中且不在 |
setxor1d(x, y) | 集合的对称差,即存在于一个数组中但不同时存在于两个数组中的元素 |
例如:
-
arr = np.array([
3,
3,
2,
2,
1,
1,
4])
-
>>np.unique(arr)
-
array([
1,
2,
3,
4])
-
# 等价于
-
>> sorted(set(arr))
-
array([
1,
2,
3,
4])
-
# np.in1d 测试一个数组中的值在另一个数组中的成员资格
-
>> np.in1d(arr, [
2,
3,
6])
-
array([
True,
True,
True,
True,
False,
False,
False])
4、线性代数
常用的numpy.linalg函数:
函数 | 说明 |
---|---|
diag | 以一维数组的形式返回方针的对角线元素,或将一维数组转换为方阵(非对角线元素为) |
dot | 矩阵乘法 |
trace | 计算对角线元素的和 |
det | 计算矩阵行列式 |
eig | 计算方阵的本征值和本征 |
inv | 计算方阵的逆 |
pinv | 计算矩阵的Moore-Penrose伪逆 |
qr | 计算QR分解 |
svd | 计算奇异值分解(SVD) |
solve | 解线性方程组Ax = b, 其中A为一个方阵 |
lstsq | 计算Ax = b的最小二乘解 |
例如:
-
from numpy.linalg
import inv,qr
-
X = randn(
5,
5)
-
mat = X.T.dot(X)
-
inv(mat)
-
mat.dot(inv(mat))
-
# qr分解
-
q, r = qr(mat)
5、生成随机数
numpy.random函数:
函数 | 说明 |
---|---|
seed | 确定随机数生成器 |
permutation | 返回一个序列的随机排序或返回一个随机排列的范围 |
shuffle | 对一个序列就地随机排列 |
rand | 产生均匀分布的样本值 |
randint | 从给定的上下限范围内随机选取整数 |
randn | 产生正态分布(平均值为0,标准差为1)的样本值 |
binomial | 产生二项分布的样本值 |
normal | 产生正态分布的样本值 |
beta | 产生beta分布的样本 |
chisquare | 产生卡方分布的样本值 |
gamma | 产生gamma分布的样本值 |
uniform | 产生在[0,1)中均匀分布的样本值 |
例如:
-
# 生成标准正态分布的4*4样本数组
-
samples = np.random.normal(size=(
4,
4))
-
# 从0开始,步长1和-1出现概率相等
-
import random
-
position =
0
-
walk = [position]
-
steps =
1000
-
for i
in xrange(steps):
-
step =
1
if random.randit(
0,
1)
else
-1
-
position += step
-
walk.append(position)
-
# 第一个到达某个特定值的时间
-
(np.abs(walk) >=
10).argmax()
#argmax 返回该布尔型数组第一个最大值的索引
6、concatenate函数
在实践过程中,会经常遇到数组拼接的问题,基于numpy库concatenate是一个非常好用的数组操作函数。
函数形式:concatenate((a1, a2, …), axis=0)
1)传入的参数必须是一个多个数组的元组或者列表;
2)另外需要指定拼接的方向,默认是 axis = 0,也就是说对0轴的数组对象进行纵向的拼接(纵向的拼接沿着axis= 1方向); 注:一般axis = 0,就是对该轴向的数组进行操作,操作方向是另外一个轴,即axis=1;
3)传入的数组必须具有相同的形状,这里的相同的形状可以满足在拼接方向axis轴上数组间的形状一致即可;
-
In [
23]: a = np.array([[
1,
2], [
3,
4]])
-
-
In [
24]: b = np.array([[
5,
6]])
-
-
In [
25]: np.concatenate((a, b), axis=
0)
-
Out[
25]:
-
array([[
1,
2],
-
[
3,
4],
-
[
5,
6]])