目录
numpy简介
性能对比
ndarray属性
numpy中的数组:
几个创建的函数:
1) np.ones(shape, dtype=None, order='C')
shape: 形状,使用元组表示
2) np.zeros(shape, dtype=float, order='C')
3) np.full(shape, fill_value, dtype=None, order='C')
4) np.eye(N, M=None, k=0, dtype=float)
5) np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
6) np.arange([start, ]stop, [step, ]dtype=None)
7) np.random.randint(low, high=None, size=None, dtype='l')
8) 正态分布函数
9) np.random.random(size=None)
10) np.random.permutation(10) 生成随机索引
11) 随机种子
Numpy数组操作
数组与数的计算:
数组与数组的计算:
广播原则:
numpy.append
numpy.insert
numpy.delete
numpy.reshape
numpy.ndarray.flatten()
numpy.ravel()
数组(矩阵)转置和轴对换:
数组的转置
ndarray的索引和切片
【重点1】ndarray的高维数组访问,使用[dim1_index, dim2_index...]
列表访问
bool访问
高维数组中使用
切片访问
ndarray的级联和切分
级联
np.concatenate()
np.hstack与np.vstack
切分
- np.split
- np.vsplit
- np.hsplit
Numpy数组操作
数组与数的计算:
数组与数组的计算:
广播原则:
数组(矩阵)转置和轴对换:
数组的转置
函数和方法method总览
创建数组
转化
操作
询问
排序
运算
基本统计
基本线性代数
numpy简介
NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。NumPy这个词来源于两个单词-- Numerical和Python。NumPy提供了大量的库函数和操作,可以帮助程序员轻松地进行数值计算。在数据分析和机器学习领域被广泛使用。他有以下几个特点:
- numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算。
- Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,效率远高于纯Python代码。
- 有一个强大的N维数组对象Array(一种类似于列表的东西)。
- 实用的线性代数、傅里叶变换和随机数生成函数。
总而言之,他是一个非常高效的用于处理数值型运算的包。
- 官网:https://docs.scipy.org/doc/numpy/user/quickstart.html。
- 中文文档:https://www.numpy.org.cn/user_guide/quickstart_tutorial/index.html。
性能对比
# Python列表的方式
import time
t1 = time.time()
a = []
for x in range(100000):
a.append(x**2)
t2 = time.time()
t = t2 - t1
print(t)
import numpy as np
t3 = time.time()
b = np.arange(100000)**2
t4 = time.time()
print(t4-t3)
0.007939815521240234
0.0010571479797363281
ndarray属性
ndarray属性 1. ndim:维度 2. shape:形状(各维度的长度) 3. size:总长度 4. dtype:元素类型
data = np.arange(12).reshape(3, 4) # 创建一个3行4列的数组
data
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
type(data)
numpy.ndarray
data.ndim # 数组维度的个数,输出结果2,表示二维数组
2
data.shape # 数组的维度,输出结果(3,4),表示3行4列
(3, 4)
data.size # 数组元素的个数,输出结果12,表示总共有12个元素
12
data.dtype # 数组元素的类型,输出结果dtype('int64'),表示元素类型都是int64
a1 = np.arange(12) #生成一个有12个数据的一维数组
print(a1)
a2 = a1.reshape((3,4)) #变成一个2维数组,是3行4列的
print(a2)
a3 = a1.reshape((2,3,2)) #变成一个3维数组,总共有2块,每一块是2行2列的
print(a3)
a4 = a2.reshape((12,)) # 将a2的二维数组重新变成一个12列的1维数组
print(a4)
a5 = a2.flatten() # 不管a2是几维数组,都将他变成一个一维数组
print(a5)
a1 = np.array([1,2,3],dtype=np.int32)
print(a1.itemsize) # 打印4,因为每个字节是8位,32位/8=4个字节
numpy中的数组:
Numpy中的数组的使用跟Python中的列表非常类似。他们之间的区别如下:
- 一个列表中可以存储多种数据类型。比如a = [1,'a']是允许的,而数组只能存储同种数据类型。
注意: - numpy默认ndarray的所有元素的类型是相同的 - 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int2.数组可以是多维的,当多维数组中所有的数据都是数值类型的时候,相当于线性代数中的矩阵,是可以进行相互间的运算的。
几个创建的函数:
1
1) np.ones(shape, dtype=None, order='C')
shape: 形状,使用元组表示
2) np.zeros(shape, dtype=float, order='C')
3) np.full(shape, fill_value, dtype=None, order='C')
4) np.eye(N, M=None, k=0, dtype=float)
5) np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
6) np.arange([start, ]stop, [step, ]dtype=None)
7) np.random.randint(low, high=None, size=None, dtype='l')
8) 正态分布函数
np.random.randn(d0, d1, ..., dn) 标准正态分布 np.random.normal() 普通正态分布
9) np.random.random(size=None)
生成0到1的随机数,左闭右开
10) np.random.permutation(10) 生成随机索引
11) 随机种子
Numpy数组操作
数组与数的计算:
在Python列表中,想要对列表中所有的元素都加一个数,要么采用map函数,要么循环整个列表进行操作。但是NumPy中的数组可以直接在数组上进行操作。示例代码如下:
import numpy as np
a1 = np.random.random((3,4))
print(a1)
# 如果想要在a1数组上所有元素都乘以10,那么可以通过以下来实现
a2 = a1*10
print(a2)
# 也可以使用round让所有的元素只保留2位小数
a3 = a2.round(2)
以上例子是相乘,其实相加、相减、相除也都是类似的。
数组与数组的计算:
- 结构相同的数组之间的运算:
a1 = np.arange(0,24).reshape((3,8))
a2 = np.random.randint(1,10,size=(3,8))
a3 = a1 + a2 #相减/相除/相乘都是可以的
print(a1)
print(a2)
print(a3)
- 与行数相同并且只有1列的数组之间的运算:
a1 = np.random.randint(10,20,size=(3,8)) #3行8列
a2 = np.random.randint(1,10,size=(3,1)) #3行1列
a3 = a1 - a2 #行数相同,且a2只有1列,能互相运算
print(a3)
- 与列数相同并且只有1行的数组之间的运算:
a1 = np.random.randint(10,20,size=(3,8)) #3行8列
a2 = np.random.randint(1,10,size=(1,8))
a3 = a1 - a2
print(a3)
广播原则:
ndarray广播机制的两条规则 如果 1. 两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符 2. 或其中的一方的长度为1 则认为它们是广播兼容的。 广播会在缺失和(或)长度为1的维度上进行。
numpy.append
### 添加元素 numpy.append 函数在数组的末尾添加值。 追加操作会分配整个数组,并把原来的数组复制到新数组中 注意: 1. 插入的维度要保证所有数组的长度是相同的 2. 如果没有指定轴,数组会被扁平处理
numpy.insert
numpy.insert 函数在给定索引之前,沿给定轴在输入数组中插入值 如果未提供轴,则输入数组会被展开
numpy.delete
### 删除元素 numpy.delete 函数返回从输入数组中删除指定子数组的新数组。 如果未提供轴参数,则输入数组将展开。
numpy.reshape
### 数组变形reshape numpy.reshape 函数可以在不改变数据的条件下修改形状,格式如下: numpy.reshape(arr, newshape, order='C') - arr:要修改形状的数组 - newshape:整数或者整数数组,新的形状应当兼容原有形状 - order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'k' -- 元素在内存中的出现顺序。
numpy.ndarray.flatten()
numpy.ravel()
### 数组扁平处理numpy.ndarray.flatten() 返回一份展开的数组拷贝,对拷贝所做的修改不会影响原始数组numpy.ravel() 展平的数组元素,返回一个展开的数组引用,修改会影响原始数组。
数组(矩阵)转置和轴对换:
numpy中的数组其实就是线性代数中的矩阵。矩阵是可以进行转置的。ndarray有一个T属性,可以返回这个数组的转置的结果。示例代码如下:
a1 = np.arange(0,24).reshape((4,6)) a2 = a1.T print(a2)另外还有一个方法叫做transpose,这个方法返回的是一个View,也即修改返回值,会影响到原来数组。示例代码如下:
a1 = np.arange(0,24).reshape((4,6)) a2 = a1.transpose()为什么要进行矩阵转置呢,有时候在做一些计算的时候需要用到。比如做矩阵的内积的时候。就必须将矩阵进行转置后再乘以之前的矩阵:
a1 = np.arange(0,24).reshape((4,6)) a2 = a1.T print(a1.dot(a2))dot()的使用
参考文档:https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html
dot()返回的是两个数组的点积(dot product)
1.如果处理的是一维数组,则得到的是两数组的內积(顺便去补一下数学知识)
a=np.random.randint(0,8,size=(2,4)) b=np.random.randint(4,16,size=(4,2)) np.dot(a,b)数组的转置
ndarray的索引和切片
【重点1】ndarray的高维数组访问,使用[dim1_index, dim2_index...]
列表访问
bool访问
bool_index = [False, True, False, True, False] arr3[bool_index]
高维数组中使用
切片访问
ndarray的级联和切分
级联
### 级联 级联的注意事项: - 级联的参数是列表:一定要加中括号或小括号 - 维度必须相同 - 形状相符 - 级联的方向默认是shape这个tuple的第一个值所代表的维度方向 - 可通过axis参数改变级联的方向
np.concatenate()
np.hstack与np.vstack
切分
与级联类似,三个函数完成切分工作: - np.split - np.vsplit - np.hsplit
- np.split
- np.vsplit
- np.hsplit
Numpy数组操作
数组与数的计算:
在Python列表中,想要对列表中所有的元素都加一个数,要么采用map函数,要么循环整个列表进行操作。但是NumPy中的数组可以直接在数组上进行操作。示例代码如下:
import numpy as np a1 = np.random.random((3,4)) print(a1) # 如果想要在a1数组上所有元素都乘以10,那么可以通过以下来实现 a2 = a1*10 print(a2) # 也可以使用round让所有的元素只保留2位小数 a3 = a2.round(2)
以上例子是相乘,其实相加、相减、相除也都是类似的。
数组与数组的计算:
- 结构相同的数组之间的运算:
a1 = np.arange(0,24).reshape((3,8)) a2 = np.random.randint(1,10,size=(3,8)) a3 = a1 + a2 #相减/相除/相乘都是可以的 print(a1) print(a2) print(a3)
- 与行数相同并且只有1列的数组之间的运算:
a1 = np.random.randint(10,20,size=(3,8)) #3行8列 a2 = np.random.randint(1,10,size=(3,1)) #3行1列 a3 = a1 - a2 #行数相同,且a2只有1列,能互相运算 print(a3)
- 与列数相同并且只有1行的数组之间的运算:
a1 = np.random.randint(10,20,size=(3,8)) #3行8列 a2 = np.random.randint(1,10,size=(1,8)) a3 = a1 - a2 print(a3)
广播原则:
ndarray广播机制的两条规则 如果 1. 两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符 2. 或其中的一方的长度为1 则认为它们是广播兼容的。 广播会在缺失和(或)长度为1的维度上进行。
numpy.append
### 添加元素 numpy.append 函数在数组的末尾添加值。 追加操作会分配整个数组,并把原来的数组复制到新数组中 注意: 1. 插入的维度要保证所有数组的长度是相同的 2. 如果没有指定轴,数组会被扁平处理
### 插入元素 numpy.insert 函数在给定索引之前,沿给定轴在输入数组中插入值 如果未提供轴,则输入数组会被展开
### 删除元素 numpy.delete 函数返回从输入数组中删除指定子数组的新数组。 如果未提供轴参数,则输入数组将展开。
### 数组变形reshape numpy.reshape 函数可以在不改变数据的条件下修改形状,格式如下: numpy.reshape(arr, newshape, order='C') - arr:要修改形状的数组 - newshape:整数或者整数数组,新的形状应当兼容原有形状 - order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'k' -- 元素在内存中的出现顺序。
### 数组扁平处理
numpy.ndarray.flatten() 返回一份展开的数组拷贝,对拷贝所做的修改不会影响原始数组
numpy.ravel() 展平的数组元素,返回一个展开的数组引用,修改会影响原始数组。
数组(矩阵)转置和轴对换:
numpy中的数组其实就是线性代数中的矩阵。矩阵是可以进行转置的。ndarray有一个T属性,可以返回这个数组的转置的结果。示例代码如下:
a1 = np.arange(0,24).reshape((4,6)) a2 = a1.T print(a2)
另外还有一个方法叫做transpose,这个方法返回的是一个View,也即修改返回值,会影响到原来数组。示例代码如下:
a1 = np.arange(0,24).reshape((4,6)) a2 = a1.transpose()
为什么要进行矩阵转置呢,有时候在做一些计算的时候需要用到。比如做矩阵的内积的时候。就必须将矩阵进行转置后再乘以之前的矩阵:
a1 = np.arange(0,24).reshape((4,6)) a2 = a1.T print(a1.dot(a2))
dot()的使用
参考文档:https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html
dot()返回的是两个数组的点积(dot product)
1.如果处理的是一维数组,则得到的是两数组的內积(顺便去补一下数学知识)
a=np.random.randint(0,8,size=(2,4)) b=np.random.randint(4,16,size=(4,2)) np.dot(a,b)
数组的转置
函数和方法method总览
这是个Numpy函数和方法分类排列目录。这些名字链接到Numpy示例,你可以看到这些函数起作用
创建数组
arange, array, copy, empty, empty_like, eye, fromfile, fromfunction, identity, linspace, logspace, mgrid, ogrid, ones, ones_like, r , zeros, zeros_like
转化
astype, atleast 1d, atleast 2d, atleast 3d, mat
操作
array split, column stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, item, newaxis, ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack
询问
all, any, nonzero, where
排序
argmax, argmin, argsort, max, min, ptp, searchsorted, sort
运算
choose, compress, cumprod, cumsum, inner, fill, imag, prod, put, putmask, real, sum
基本统计
cov, mean, std, var
基本线性代数
cross, dot, outer, svd, vdot