Numpy、Pandas、Matplotlib整理文档

Numpy

引入Numpy

获取并安装numpy包:
conda install numpy

pip install numpy

引入numpy:import numpy as np

空值: numpy.nan

e: numpy.e

圆周率: numpy.pi

正无穷大: numpy.inf

其他常量用到了再查

import numpy as np

创建ndarray数组对象

创建一个数组

numpy.array()

创建一个数组

np.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None) -> ndarray

参数说明:

名称描述
object数组或嵌套的数列
dtype数组元素的数据类型(numpy的数据类型详见https://www.runoob.com/numpy/numpy-dtype.html)
copy对象是否需要复制,可选
order创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok默认返回一个与基类类型一致的数组
ndmin指定生成数组的最小维度
arr1 = np.array([[12,3,4],
               [23,4,67]], dtype = complex)

print(arr1)
[[12.+0.j  3.+0.j  4.+0.j]
 [23.+0.j  4.+0.j 67.+0.j]]

创建一个空数组

numpy.empty()

创建一个空数组(其实是生成一个各个元素都十分接近0的数组)

numpy.empty(shape, dtype = float, order = 'C') -> ndarray

参数说明:

参数描述
shape数组形状
dtype数据类型,可选
order有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
arr2 = np.empty((2,3))

print(arr2)
[[0. 0. 0.]
 [0. 0. 0.]]

创建一个零数组

numpy.zeros()

创建一个零数组

numpy.zeros(shape, dtype = float, order = 'C') -> ndarray

参数说明:

参数描述
shape数组形状
dtype数据类型,可选
order‘C’ 用于 C 的行数组,或者 ‘F’ 用于 FORTRAN 的列数组
arr3 = np.zeros((2,3))

print(arr3)
[[0. 0. 0.]
 [0. 0. 0.]]

创建一个所有元素都为1的数组

numpy.ones()

创建指定形状的数组,数组元素以 1 来填充:

numpy.ones(shape, dtype = None, order = 'C') -> ndarray

同numpy.zeros()

从数值范围创建数组

numpy.arange()

从数值范围创建数组, 用于创建一个一维数组,使用 arange 函数创建数值范围并返回 ndarray 对象

numpy.arange(start, stop, step, dtype) -> ndarray

根据 start 与 stop 指定的范围(含左不含右)以及 step 设定的步长,生成一个 ndarray。

参数说明:

参数描述
start起始值,默认为0
stop终止值(不包含)
step步长,默认为1
dtype返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。
arr4 = np.arange(9, 3, -1).reshape((2,3))

print(arr4)
[[9 8 7]
 [6 5 4]]

创建一个等差数列构成的数组

numpy.linspace()

从数值范围创建数组,用于创建一个一维数组,数组是一个

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) -> ndarray

参数说明:

参数描述
start序列的起始值
stop序列的终止值,如果endpoint为true,该值包含于数列中
num要生成的等步长的样本数量,默认为50
endpoint该值为 true 时,数列中包含stop值,反之不包含,默认是True。
retstep如果为 True 时,生成的数组中会显示间距,反之不显示。
dtypendarray 的数据类型
print(np.linspace(1,10,10))
print(np.linspace(1,10,10, endpoint =  False))

创建一个等比数列构成的数组

numpy.logspace()

从数值范围创建数组,用于创建一个一维数组,数组是一个等比数列构成的

numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None) -> ndarray

参数说明:

参数描述
start序列的起始值为:base ** start
stop序列的终止值为:base ** stop。如果endpoint为true,该值包含于数列中
num要生成的等步长的样本数量,默认为50
endpoint该值为 true 时,数列中包含stop值,反之不包含,默认是True。
base对数 log 的底数。
dtypendarray 的数据类型
print (np.logspace(0,9,10))
print (np.logspace(0,9,10,base=2))
[1.e+00 1.e+01 1.e+02 1.e+03 1.e+04 1.e+05 1.e+06 1.e+07 1.e+08 1.e+09]
[  1.   2.   4.   8.  16.  32.  64. 128. 256. 512.]

创建一个元素为随机数的数组

numpy.random.random()

创建一个指定size的数组,其元素由位于[0,1)的随机数组成

numpy.random.random(size: Any = None) -> ndarray

参数说明:

参数描述
size数组的形状
print(np.random.random((2,4)))
[[0.89708488 0.18298315 0.91853714 0.72948609]
 [0.97949962 0.9876352  0.11712189 0.99488907]]

创建一个对角线元素是1,其余为0的数组

numpy.eye()

创建一个矩阵,对角线元素为 1,其他位置为零。

numpy.eye(N, M=None, k=0, dtype=float, order='C', *, like=None) -> ndarray

参数描述
N矩阵的行数
M矩阵的列数,默认为 N
k对角线的索引
dtype数据类型
order储存方式,‘C’:行优先 (C-Fstyle) 或’F’:c列优先 (Fortran-style)
print (np.eye(5, 7, dtype =  float))
[[1. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0.]]

创建一个单位阵

numpy.identity(n, dtype=None, *, like=None) -> ndarray

参数描述
n矩阵的行数
dtype数据类型

从已有的数组创建数组:

numpy.asarray(a, dtype = None, order = None)

numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

numpy.fromiter(iterable, dtype, count=-1)

详见https://www.runoob.com/numpy/numpy-array-from-existing-data.html

ndarray 重定义形状的方法

  • ndarray.reshape()

ndarray.reshape(object, order='C') -> ndarray

从object传入一个数组(如(3,4))将ndarray对象重新定义为该形状,如上面numpy.arange()的示例中就用到了该方法

参数说明:

参数描述
shape数组形状
order有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。

  • ndarray.flatten()

ndarray.flatten(order='C') -> ndarray

将数组转为一维行向量

参数说明:

参数描述
order{‘C’, ‘F’, ‘A’, ‘K’}
可选的,指定折叠的顺序。'C’表示按照行优先(C风格)的顺序折叠。'F’表示按照列优先(Fortran风格)的顺序折叠。'A’表示如果a在内存中是Fortran连续的,就按照列优先的顺序折叠,否则按照行优先的顺序折叠。‘K’表示按照元素在内存中出现的顺序折叠。默认值是’C’。

注意:ndarray.flat是得到一个迭代每一个元素的迭代器

ndarray属性

属性说明
ndarray.ndim秩,即轴的数量或维度的数量
ndarray.shape数组的维度,对于矩阵,n 行 m 列
ndarray.size数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtypendarray 对象的元素类型
ndarray.itemsizendarray 对象中每个元素的大小,以字节为单位
ndarray.flagsndarray 对象的内存信息
ndarray.realndarray元素的实部
ndarray.imagndarray 元素的虚部
ndarray.data包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性

改变矩阵维度

[1 1 1]的shape是(3,)

[[1 1 1]]的shape是(3, 1)

两个数组的shape并不相同

我们发现,我们不能通过ndarray.T来得到一个一维行向量的转置,究其原因,是因为这个矩阵的属性中,只有维度0(行),没有维度1(列)。为了解决这个问题,我们可以使用numpy.newaxis这个量来为数组新增维度。

如:

A = A[numpy.newaxis, :]来为矩阵A在第一个轴之前新增一个轴

A = A[:, numpy.newaxis]来为矩阵A在最后一个轴之后新增一个轴

numpy中ndarray的基础运算

arr5 = np.array([[1,2],
              [3,4]])
arr6 = np.array([[11,12],
              [13,14]])

逐个元素的计算

现有两个数组:arr5、arr6,可以通过以下方式对这两个数组中的元素进行逐个计算

  • 二元操作符
    • arr5 + arr6 -> ndarray:arr5与arr6中的对应元素逐个相加
    • arr5 - arr6 -> ndarray:arr5中的元素逐个减去arr6中的对应元素
    • arr5 * arr6 -> ndarray:arr5与arr6中的对应元素逐个相乘
    • arr5 / arr6 -> ndarray:arr5与arr6中的对应元素逐个相除(注意除数不能为0)
    • arr5 ** arr6 -> ndarray:arr5中的元素逐个取arr6中的对应元素次方(arr5[i]=arr5[i]**arr6[i])

  • 三角函数运算
    • numpy.sin(object) -> ndarray/float:可传入ndarray、int等类型、np.pi,会对ndarray中的每个元素分别取正弦(弧度制),传入int等类型时,则计算它的正弦值
    • numpy.arcsin -> ndarray/float:同上,计算反正弦值
    • numpy.sinh -> ndarray/float:同上,计算双曲正弦值
    • numpy.cos -> ndarray/float:同上,计算余弦值

  • 比较大小
    • arr5 > i -> ndarray:返回一个dtype为bool,size与arr5相同的数组,该数组的每个对应元素为:arr5[i] > i得到的bool值
    • arr5 >= i -> ndarray:同上
    • arr5 < i -> ndarray:同上
    • arr5 <= i -> ndarray:同上
    • arr5 == i -> ndarray:同上

求和、求最小值、求最大值


  • numpy.sum()

求和

numpy.sum(a, axis = None, dtype = None, out = None, keepdims = <no value>, initial = <no value>, where = <no value>) -> any

参数说明:

参数描述
aarray_like
这意味着输入可以是任何可以转换为数组的对象,比如列表,元组,或者另一个数组。
axisNone or int or tuple of ints, optional
这意味着你可以指定沿哪个轴或哪些轴进行求和。如果你不指定任何轴,求和会计算输入数组的所有元素。如果你指定一个负数的轴,它会从最后一个轴开始往前数。比如,axis=-1表示输入数组的最后一个轴。如果你指定一个整数的元组,求和会同时计算元组中指定的多个轴。比如,axis=(0,1)表示求和会计算输入数组的第一和第二个轴。
dtypedtype, optional
这意味着你可以指定输出数组和中间计算的数据类型。如果你不指定任何数据类型,输入数组的数据类型会被默认使用。但是,如果输入数组有一个比默认平台整数更低精度的整数数据类型,那么会使用一个不同的数据类型。比如,如果你的平台默认使用64位整数,而你的输入数组有32位整数,那么输出数组会有64位整数。如果你的输入数组有有符号整数,那么输出数组也会有有符号整数。如果你的输入数组有无符号整数,那么输出数组也会有无符号整数。
outndarray, optional
这意味着你可以提供一个已存在的数组来存储求和的结果。这个数组的形状必须和预期输出的形状一致。如果这个数组的数据类型和输出的数据类型不同,那么输出值会被转换为适合这个数组的数据类型。
keepdimsbool, optional
这意味着你可以选择是否保留或移除被求和减少的轴。如果你设置这个为True,那么减少的轴会保留在输出中,作为大小为一的维度。这可以帮助你正确地将输出和输入数组进行广播。比如,如果你的输入数组有形状(3,4),并且你沿着axis=1进行求和,并且keepdims=True,那么你的输出数组会有形状(3,1),而不是(3,)。如果你不提供任何值给keepdims,那么它不会被传递给ndarray子类的sum方法。但是,如果你提供了一个非默认值给keepdims,那么它会被传递给ndarray子类的sum方法。如果子类没有实现keepdims,那么会抛出异常。
initialscalar, optional
这意味着你可以提供一个求和的初始值。这在你想要在求和之前给数组的所有元素加上一个常数值时很有用。比如,如果你的输入数组有值[1,2,3],并且你提供了一个初始值10,那么你的输出会是16而不是6。
wherearray_like of bool, optional
这意味着你可以提供一个布尔掩码来选择哪些元素参与求和。这个掩码的形状必须和输入数组的形状一致。只有掩码为True的元素才会被求和。比如,如果你的输入数组有值[1,-2,-3],并且你的掩码是[True,False,True],那么你的输出会是-2

  • numpy.min()

求最小值

numpy.min(a, axis = None, dtype = None, out = None, keepdims = <no value>, initial = <no value>, where = <no value>) -> any

参数同上


  • numpy.max()

求最大值

numpy.max(a, axis = None, dtype = None, out = None, keepdims = <no value>, initial = <no value>, where = <no value>) -> any

参数同上

一般而言,可以先学会a和axis参数,其他参数等需要时再了解

求定轴最值

numpy.amin()numpy.amax()

numpy.amin() 用于计算数组中的元素沿指定轴的最小值。

numpy.amax() 用于计算数组中的元素沿指定轴的最大值。

最小值索引、最大值索引

  • numpy.argmin()

argmin(a , axis = None, out = None, *, keepdims = np._NoValue) -> Any

求数组中最小值的索引

参数说明

参数描述
aarray_like
这意味着输入可以是任何可以转换为数组的对象,比如列表,元组,或者另一个数组。
axisNone or int or tuple of ints, optional
这意味着你可以指定沿哪个轴或哪些轴进行求和。如果你不指定任何轴,求和会计算输入数组的所有元素。如果你指定一个负数的轴,它会从最后一个轴开始往前数。比如,axis=-1表示输入数组的最后一个轴。如果你指定一个整数的元组,求和会同时计算元组中指定的多个轴。比如,axis=(0,1)表示求和会计算输入数组的第一和第二个轴。
outndarray, optional
这意味着你可以提供一个已存在的数组来存储求和的结果。这个数组的形状必须和预期输出的形状一致。如果这个数组的数据类型和输出的数据类型不同,那么输出值会被转换为适合这个数组的数据类型。
keepdimsbool, optional
这意味着你可以选择是否保留或移除被求和减少的轴。如果你设置这个为True,那么减少的轴会保留在输出中,作为大小为一的维度。这可以帮助你正确地将输出和输入数组进行广播。比如,如果你的输入数组有形状(3,4),并且你沿着axis=1进行求和,并且keepdims=True,那么你的输出数组会有形状(3,1),而不是(3,)。如果你不提供任何值给keepdims,那么它不会被传递给ndarray子类的sum方法。但是,如果你提供了一个非默认值给keepdims,那么它会被传递给ndarray子类的sum方法。如果子类没有实现keepdims,那么会抛出异常。
  • numpy.argmax()

求数组中最大值的索引

参数同上

print(arr6.T)
print(arr6.T.argmax())
print(arr6.T.argmax(axis = 1))
[[11 13]
 [12 14]]
3
[1 1]

求平均值

  • numpy.mean()/nbarray.mean()

计算数组中元素的平均值

numpy.sum(a, axis = None, dtype = None, out = None, keepdims = <no value>, initial = <no value>, where = <no value>) -> any

参数同numpy.sum()

  • numpy.average()

计算数组中元素的加权平均值

average(a, axis = None, weights = None, returned = False, *, keepdims = np._NoValue) -> tuple[Any, Any | None]

参数说明:

参数描述
aarray_like
这意味着输入可以是任何可以转换为数组的对象,比如列表,元组,或者另一个数组。
axisNone or int or tuple of ints, optional
这意味着你可以指定沿哪个轴或哪些轴进行求和。如果你不指定任何轴,求和会计算输入数组的所有元素。如果你指定一个负数的轴,它会从最后一个轴开始往前数。比如,axis=-1表示输入数组的最后一个轴。如果你指定一个整数的元组,求和会同时计算元组中指定的多个轴。比如,axis=(0,1)表示求和会计算输入数组的第一和第二个轴。
weights一个权重的数组
returned默认为false,如果设为 true,则返回权重的和
keepdimsbool, optional
这意味着你可以选择是否保留或移除被求和减少的轴。如果你设置这个为True,那么减少的轴会保留在输出中,作为大小为一的维度。这可以帮助你正确地将输出和输入数组进行广播。比如,如果你的输入数组有形状(3,4),并且你沿着axis=1进行求和,并且keepdims=True,那么你的输出数组会有形状(3,1),而不是(3,)。如果你不提供任何值给keepdims,那么它不会被传递给ndarray子类的sum方法。但是,如果你提供了一个非默认值给keepdims,那么它会被传递给ndarray子类的sum方法。如果子类没有实现keepdims,那么会抛出异常。
print(np.array([[1,2,3,4],
                [3,4,5,6]]))
print (np.average([[1,2,3,4],
                   [3,4,5,6]],weights =  [[4,3,2,1],[3,4,5,6]], returned =  True))
[[1 2 3 4]
 [3 4 5 6]]
(3.7857142857142856, 28.0)

求中位数

numpy.median()

numpy.median(a, axis=None, out=None, overwrite_input=False, keepdims=False)

参数说明:

参数描述
overwrite_input默认为False,如果为True,则在计算中会直接使用原数组而不是使用副本进行计算,虽然这会改变原数组,但是可以节省内存。如果原数组不再使用,可以将此参数设置为True.同时,如果“overwrite_input”为“True”而“a”不是“ndarray”类型,将报错。
print(np.array([[1,2,3,4],
                [3,4,5,6]]))
print (np.median([[1,2,3,4],
                   [3,4,5,6]], overwrite_input = True))
[[1 2 3 4]
 [3 4 5 6]]
3.5

求标准差

numpy.std(ndarray)

求方差

np.var(ndarray, ddof = 0)

参数说明:

ddof : 自由度,无偏估计方差的ddof为1

求百分位数

numpy.percentile()

百分位数是统计中使用的度量,表示小于这个值的观察值的百分比。 函数numpy.percentile()接受以下参数。

numpy.percentile(a, q, axis)
参数说明:

a: 输入数组
q: 要计算的百分位数,在 0 ~ 100 之间
axis: 沿着它计算百分位数的轴

求极差

numpy.ptp()

numpy.ptp()函数计算数组中元素最大值与最小值的差(最大值 - 最小值)。

每个元素累加

numpy.cumsum()

numpy.cumsum(a, axis=None, dtype=None, out=None) -> ndarray

生成一个元素分别为数组a中对应元素与索引更小的元素的累加的一维数组

print(np.array([[1,2,3,4],
                [3,4,5,6]]))
print (np.cumsum([[1,2,3,4],
                [3,4,5,6]]))
[[1 2 3 4]
 [3 4 5 6]]
[ 1  3  6 10 13 17 22 28]

按轴每两个元素取差

numpy.diff()

这是一个用于计算沿着给定轴的n阶离散差分的函数1。离散差分是指相邻元素之间的差值,例如,一阶差分由out[i] = a[i+1] - a[i]沿着给定轴计算,更高阶的差分可以通过递归地使用diff函数计算2。

numpy.diff(a, n=1, axis=-1, prepend=np._NoValue, append=np._NoValue) -> ndarray

参数说明:

参数描述
a输入的数组
n差分的次数。如果为零,直接返回输入数组。默认为1。
axis差分的轴,即沿着哪个维度进行差分。默认为最后一个轴。
prepend,appendarray_like, optional 在执行差分之前,在轴的前面或后面添加的值。如果是标量值,会扩展成长度为1的数组,并沿着其他轴保持输入数组的形状。否则,除了轴之外,必须和输入数组的维度和形状匹配。这个参数在版本1.16.0中新增。
print(np.array([[1,2,3,4],
                [3,4,5,6]]))
print (np.diff([[1,2,3,4],
                [3,4,5,6]]))
[[1 2 3 4]
 [3 4 5 6]]
[[1 1 1]
 [1 1 1]]

查找非0的数的索引

numpy.nonzero()

这是一个用于返回数组中非零元素的索引的函数。它返回一个元组,每个元组的元素是一个数组,表示对应维度上非零元素的索引。数组中的值总是按照行优先,C风格的顺序进行测试和返回。

numpy.nonzero(a) -> tuple

返回的元组中包含数组维度数个数的元素,分别是一个ndarray,对应的是非0元素的位置

print(np.array([[0,2,3,4],
                [3,4,0,6]]))
print(np.nonzero([[0,2,3,4],
                [3,4,0,6]]))
[[0 2 3 4]
 [3 4 0 6]]
(array([0, 0, 0, 1, 1, 1], dtype=int64), array([1, 2, 3, 0, 1, 3], dtype=int64))

排序

numpy.sort()

numpy.sort(a, axis=-1, kind=None, order=None) -> ndarray

sort是一个函数,它可以对一个类似数组的对象进行排序,并返回一个排序后的副本。函数返回一个和a类型和形状相同的数组,表示排序后的结果。

参数说明:

参数描述
a类似数组的对象,需要被排序的对象。
axis整数或者None,可选的,指定沿着哪个轴进行排序。如果是None,那么对象会被展平成一维再排序。默认值是-1,表示沿着最后一个轴排序。
kind{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’}
可选的,指定排序算法。默认值是’quicksort’。注意,'stable’和’mergesort’都使用了timsort或者radix sort作为底层实现,而且一般来说,实际的实现会根据数据类型而变化。'mergesort’选项是为了向后兼容而保留的。在1.15.0版本中,增加了’stable’选项。
order字符串或者字符串列表,可选的,当a是一个有字段定义的数组时,这个参数指定哪些字段先比较,哪些字段后比较等等。一个字段可以用一个字符串来指定,而且不需要指定所有的字段,但是没有指定的字段仍然会被使用,在它们在数据类型中出现的顺序来打破平局。
print(np.array([[0,2,3,4],
                [3,4,0,6]]))
print(np.array([[0,2,3,4],
                [3,4,0,6]]))
print(np.sort([[0,2,3,4],
                [3,4,0,6]], axis=None).reshape((2,4)))
[[0 2 3 4]
 [3 4 0 6]]
[[0 2 3 4]
 [3 4 0 6]]
[[0 0 2 3]
 [3 4 4 6]]

clip限幅滤波

numpy.clip()

clip函数可以对一个数组中的值进行限制。给定一个区间,超出区间的值会被裁剪到区间的边界。例如,如果指定一个[0, 1]的区间,小于0的值变成0,大于1的值变成1。

numpy.clip(a, a_min, a_max, out=None, **kwargs) -> ndarray

参数说明:

参数描述
a类似数组的对象,包含需要被裁剪的元素。
a_min最小值,所有小于这个值的元素都会等于这个值。如果是None,则不会进行对这个边界的裁剪
a_max最大值,所有大于这个值的元素都会等于这个值。如果是None,则不会进行对这个边界的裁剪
out可选的,结果会被放在这个数组中。它可以是输入数组,用于原地裁剪。
**kwargs其他的只能用关键字的参数,参见ufunc文档。

线性代数

矩阵转置
  • numpy.transpose(a, axes=None) -> ndarray

求矩阵a的转置矩阵

参数说明:

参数描述
andarray 数组
axes整数元组或者整数列表,如果指定了,它必须是一个包含[0,1,…,N-1]的排列,其中N是a的轴数。返回的数组的第i个轴会对应输入的第axes[i]个轴。如果没有指定,默认值是range(a.ndim)[::-1],也就是反转轴的顺序。
  • a.T

返回矩阵a的转置矩阵,没有参数

print(arr5)
print(np.transpose(arr5))
print(arr5.T)
[[1 2]
 [3 4]]
[[1 3]
 [2 4]]
[[1 3]
 [2 4]]
两个数组的点乘(积)

numpy.dot(a, b, out=None) -> ndarray

矩阵a与矩阵b点乘(AB)

参数说明:

参数描述
andarray 数组
bndarray 数组
outndarray, 可选,用来保存dot()的计算结果

ndarray.dot(self, *args, **kwargs) -> ndarray

同样是点乘,不过是一个ndarray的方法,a.dot(b)与numpy.dot(a,b)等价

print(np.dot(arr5,arr6))
print(arr5.dot(arr6))
[[37 40]
 [85 92]]
[[37 40]
 [85 92]]
两个向量的点乘(积)

numpy.vdot(a, b) -> ndarray

计算两个向量的点积。 如果第一个参数是复数,那么它的共轭复数会用于计算。 如果参数是多维数组,它会被展开。

参数说明:

参数描述
andarray 数组
bndarray 数组
两个数组的内积

numpy.inner(a, b) -> ndarray

返回一维数组的向量内积。对于更高的维度,它返回最后一个轴上的和的乘积。

参数说明:

参数描述
andarray 数组
bndarray 数组
print (np.inner(np.array([1,2,3]),np.array([0,1,0])))
# 等价于 1*0+2*1+3*0
2
两个数组的矩阵积

numpy.matmul(x1, x2) -> ndarray

原代码:def matmul(x1, x2, *args, **kwargs):

返回两个数组的矩阵乘积。 虽然它返回二维数组的正常乘积,但如果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈,并进行相应广播。

另一方面,如果任一参数是一维数组,则通过在其维度上附加 1 来将其提升为矩阵,并在乘法之后被去除。

参数说明:

参数描述
x1ndarray 数组
x2ndarray 数组

对于二维数组,它就是矩阵乘法

# 二维和二维运算

print("二维和二维运算:")
a = [[1,0],[0,1]] 
b = [[4,1],[2,2]] 
print (np.matmul(a,b))

#二维和一维运算

print("二维和一维运算:")
a = [[1,0],[0,1]] 
b = [1,2] 
print (np.matmul(a,b))
print (np.matmul(b,a))

# 维度大于二的数组

print("维度大于二的数组:")
a = np.arange(8).reshape(2,2,2) 
b = np.arange(4).reshape(2,2) 
print(np.matmul(a,b))
二维和二维运算:
[[4 1]
 [2 2]]
二维和一维运算:
[1 2]
[1 2]
维度大于二的数组:
[[[ 2  3]
  [ 6 11]]

 [[10 19]
  [14 27]]]
数组的行列式(determinant)

numpy.linalg.det(a) -> Any

求数组的行列式

参数描述
andarray 数组
print(np.linalg.det(np.array([[1,2],
                              [3,4]])))
-2.0000000000000004
求解线性矩阵方程

numpy.linalg.solve(a, b) -> Any

求解线性方程AX = B中的X

| 参数 | 描述 |b
| — | — |
| a | ndarray 数组,AX = B中的A |
| b | ndarray 数组,AX = B中的B |

计算矩阵的乘法逆矩阵

numpy.linalg.inv(a) -> ndarray

计算矩阵的逆矩阵

x = np.array([[1,2],[3,4]]) 
y = np.linalg.inv(x) 
print (x)
print (y)
print (np.dot(x,y))
[[1 2]
 [3 4]]
[[-2.   1. ]
 [ 1.5 -0.5]]
[[1.00000000e+00 1.11022302e-16]
 [0.00000000e+00 1.00000000e+00]]

广播机制(Broadcast)

广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式

详见https://www.runoob.com/numpy/numpy-broadcast.html

增删改

numpy索引

对于一个ndarray对象,其索引的方式和多维列表方式一样

arr7 = np.arange(3,15).reshape((3,4))
print(arr7)
[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]

可以使用多个中括号进行索引

print(arr7[2])
print(arr7[2][1])
[11 12 13 14]
12

可以使用逗号分隔的一个中括号进行索引

print(arr7[2,1])
12

可以使用切片(用冒号表示索引范围)(含左不含右)

print(arr7[2,1:3])
print(arr7[2,:])
[12 13]
[11 12 13 14]

ndarray迭代

语法

语法:

for value in ndarray:
    ...... 

value得到迭代的一个行向量(一维数组)

  • 如果数组不是一个行向量,则对ndarray沿最后一个轴迭代(如对二维数组,就是对行迭代)

  • 如果数组是一个行向量,则对每个元素进行迭代

可以通过一定的计算来进行对其他轴的迭代,

如对一个二维数组进行列迭代:

for column in A.T:
    print(column)

对每个元素进行迭代: ndarray.flat得到迭代每个元素的迭代器

for item in A.flat:
    print(item)
print(np.array([[1,2,3],
               [2,3,4]]))

for row in np.array([[1,2,3],
                     [2,3,4]]):
    print(row)
    
for column in np.array([[1,2,3],
                     [2,3,4]]).T:
    print(column)

for item in np.array([[1,2,3],
                     [2,3,4]]).flat:
    print(item)
[[1 2 3]
 [2 3 4]]
[1 2 3]
[2 3 4]
[1 2]
[2 3]
[3 4]
1
2
3
2
3
4

迭代器对象

nditer迭代器对象提供了一种灵活遍历所有元素的方法

numoy.nditer(a, order='C', op_flags=['read-only']) -> nditer

for x in numpy.nditer(a, order='F', op_flags=['read-only']):
    ...

参数说明:

参数描述
andarray 数组
order迭代顺序,“F”:Fortran order,即是列序优先; “C”:C order,即是行序优先,默认为"C"
op_flags遍历模式,默认情况下,nditer 将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值得修改,必须指定 readwrite 或者 writeonly 的模式。
print(arr7)

for x in np.nditer(arr7):
    print(x)
[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]
3
4
5
6
7
8
9
10
11
12
13
14

数组的合并(连接数组)

连接沿现有轴的数组序列

numpy.concatenate(arrays, axis=None, out=None, *, dtype=None, casting=None) -> ndarray

一般用:numpy.concatenate((a1, a2, ...), axis) -> ndarray

参数说明:

参数描述
arrays一个数组的元组
a1, a2, …:相同类型的数组
axis沿着它连接数组的轴,默认为 0
out输出的数组
dtype指定输出数组和中间计算的数据类型
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, 控制可能发生的数据转换类型。默认为“same_kind”。

沿着新的轴加入一系列数组

stack(arrays, axis=0, out=None, *, dtype=None, casting="same_kind") -> ndarray

一般用:numpy.stack(arrays, axis) -> ndarray

参数说明:

参数描述
arrays一个数组的元组
a1, a2, …:相同类型的数组
axis沿着它连接数组的轴,默认为 0
out输出的数组
dtype指定输出数组和中间计算的数据类型
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, 控制可能发生的数据转换类型。默认为“same_kind”。

水平堆叠序列中的数组(列方向)

numpy.hstack(tup, *, dtype=None, casting="same_kind") -> ndarray

一般用:numpy.hstack(tup) -> ndarray

numpy.hstack 是 numpy.stack 函数的变体,它通过水平堆叠来生成数组。

参数说明:

参数描述
tup水平拼接的数组的元组
dtype指定输出数组和中间计算的数据类型
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, 控制可能发生的数据转换类型。默认为“same_kind”。

竖直堆叠序列中的数组(行方向)

numpy.vstack(tup, *, dtype=None, casting="same_kind") -> ndarray

一般用:numpy.vstack(tup) -> ndarray

numpy.vstack 是 numpy.stack 函数的变体,它通过垂直堆叠来生成数组。

参数说明:

参数描述
tup竖直拼接的数组的元组
dtype指定输出数组和中间计算的数据类型
casting{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, 控制可能发生的数据转换类型。默认为“same_kind”。
print(arr5)
print(arr6)

print(np.vstack((arr5, arr6)))
[[1 2]
 [3 4]]
[[11 12]
 [13 14]]
[[ 1  2]
 [ 3  4]
 [11 12]
 [13 14]]

数组的分割

将一个数组分割为多个子数组

numpy.split(ary, indices_or_sections, axis=0) -> list of ndarrays

参数说明:

参数描述
ary被分割的数组
indices_or_sections切分方式,如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)
axis设置沿着哪个方向进行切分,默认为 0,横向切分,即水平方向。为 1 时,纵向切分,即竖直方向。

hsplit 将一个数组水平分割为多个子数组(按列)
vsplit 将一个数组垂直分割为多个子数组(按行)

将一个数组水平分割为多个子数组(按列)

numpy.hsplit(ary, indices_or_sections) -> list of ndarrays

参数说明:

参数描述
ary被分割的数组
indices_or_sections切分方式,如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)

将一个数组垂直分割为多个子数组(按行)

numpy.vsplit(ary, indices_or_sections) -> list of ndarrays

参数说明:

参数描述
ary被分割的数组
indices_or_sections切分方式,如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)

数组的副本和视图

视图(浅拷贝)

使用A = ndarray.view()创建一个视图

改变A的shape:A.shape = 2,3,不会改变原数组的shape

改变A的元素会改变原数组的对应元素

副本(深拷贝)

一个数组直接复制给另外一个变量,两个变量都指向同一个数组,相当于两个指针变量指向同一块内存

A = arr7

print(A is arr7)
True

当需要一个数组的拷贝时,我们可以使用A = ndarray.copy()对数组进行深拷贝

数组A已经分配了一个新的内存,与原数组无关了

B = arr7.copy()

print(B is arr7)
False


Pandas

import pandas as pd

设置可以展示的行数和列数

  • pd.set_option('max_columns', 100)

设置为最大可以展示100列

  • pd.set_option('max_rows', 500)

设置为最大可以展示500行

数据结构

Series

一维数组,与Numpy中的一维array类似,二者与Python中的List也很类似。Series能保存不同的数据类型,字符串、boolean值、数字等都能保存在Series中。

一维Series可以使用一维列表给化:

pandas.Series(data, index, dtype, name, copy, fastpath) -> Series

参数说明:

参数描述
data数据
index索引
dtype数据类型
nameSeries的名称
copy复制
fastpath

data: Any = None,

index: Any = None,

dtype: ExtensionDtype | str | dtype | Type[str] | Type[complex] | Type[bool] | Type[object] | None = None,

name: Any = None,

copy: bool | None = None,

fastpath: bool = False

s = pd.Series([1,3,5,np.nan,6,6], index = ["a", "b", "c", "d", "e", "f"])
print(s)
a    1.0
b    3.0
c    5.0
d    NaN
e    6.0
f    6.0
dtype: float64

默认情况下,Series的下标都是数字(可以使用额外参数指定),类型是统一的。

查看index和values

Series.index

查看Series的所有索引

Series.alues

查看Series的所有值

s.index
Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
s.values
array([ 1.,  3.,  5., nan,  6.,  6.])
可以使用索引和切片
print(s[2:5])
print(s[::2])#步长为2
c    5.0
d    NaN
e    6.0
dtype: float64
a    1.0
c    5.0
e    6.0
dtype: float64
Series的属性
属性描述
data数据
index索引
dtype数据类型
nameSeries的名称
copy复制
fastpath
s.name = "索引"
print(s)
a    1.0
b    3.0
c    5.0
d    NaN
e    6.0
f    6.0
Name: 索引, dtype: float64

DataFrame

二维的表格型数据结构。很多功能与data.frame类似。可以将DataFrame理解为Series的容器。

DataFrane则是个二维结构,这里首先构造一组时间序列,作为我们第一维的下标:
然后创健一个DataFrane结构:
默认情况下,如果不指定i1dex静数和c0l,那么他们的值将用从0开始的数字替代.
除了向DataFr中传入二雄数相,我们也可以使用字典传入数据:
字典的每个key代表一列,其value可以是名种够转化为S:es的对象。
与5 eries要求所有的类型都一数不同,DntaFrase只要求每一列数的格式相同:

DataFrane则是个二维结构,这里首先构造一组时间序列,作为我们第一维的下标:

创建Index序列
用时间创建Index序列
date = pd.date_range("20180101",periods = 6)
print(date)
创健一个DataFrane结构

pd.DataFrame(data,index,columns,dtype,copy) -> DataFrame

参数描述
data数据
index行索引
columns列索引
dtype数据类型
copy是否创建副本
df = pd.DataFrame(np.random.randn(6,4),index=date,columns=list('ABCD'))
df

特别地,若data传入了一个字典,则字典的key就列名,value则是每一列的数据

df2 = pd.DataFrame({'A':pd.Series(1,index=list(range(4)),dtype=float),"B":np.array([3]*4,dtype=int),"C":pd.Categorical(["test","train","test","train"]),'D':pd.Timestamp('20181001')})

df2

DataFrame只要求每一列数据的类型相同

查看数据

按行查看数据

DataFrame.head(n)

查看前n行数据(n默认为5)

DataFrame.tail(n)

查看后n行数据(n默认为5)

df.head()
查看每列数据的数据类型

DataFrame.dtypes

df2.dtypes

查看行标、列标、数据

DataFrame.index

查看行标

DataFrame.columns

查看列标

DataFrame.values

查看数据

df2.index
df2.values

查看行数(数据条数)

使用len:

len(DataFrame)

索引

也可用DataFrame[]这样的索引、切片形式来指定返回的行

可以用DataFrame[]来查看指定索引的列的数据

DataFrame[一个或多个列索引(逗号分隔)/列切片][一个或多个行索引(逗号分隔)/行切片]来查看指定索引的行列的数据,如:df['名字','类型'][:5]

也有条件取数据的语法(原理:df[‘A’]==0这类语法返回一个bool形的列表,再放进索引的位置,用作掩码):

df[df['A']==0][:5]#提取数据(筛选条件: A列中数字为0的数据所在的前5行)

df[df['产地']=='美国'&df['评分']>9]

也可写作:

df[df.产地=='美国'&df.评分>9]

索引只能在列上使用列标,而行上只能使用索引,所以要访问行的话,还是用loc更方便,可以使用行标

查看DataFrame详细信息

DataFrame.info()

读取数据及数据操作

读数据

pandas.read_excel()

pandas.read_csv()

pandas.read_json()

以及更多

使用路径时,在字符串前加r表示不需要转义(原生字符串),如r'F:\PythonStudy\Notebook'

我们详细讲pandas.read_excel():

参数
io
sheet_name=0
header=0
names=None
index_col=None
usecols=None
squeeze=False
dtype=None
engine=None
converters=None
true_values=None
false_values=None
skiprows=None
nrows=None
na_values=None
keep_default_na=True
verbose=False
parse_dates=False
date_parser=None
thousands=None
comment=None
skipfooter=0
convert_float=True
mangle_dupe_cols=True
**kwds

参数看着很多,但其实我们日常用到的就几个,:

参数说明
io(str)读取的文件路径
sheet_name=0(str, int, list, None, default 0)默认为0,读取第一个sheet的全部数据该参数可以为:str字符串用于引用的sheet的名称int整数用于引用的sheet的索引(从0开始)字符串或整数组成的列表用于引用特定的sheetNone 表示引用所有sheet注意,如果读取了多个sheet,读取后的数据类型是OrderedDict,它将两个sheet的数据合并到了一个list中
header=0(int, list of int, default 0)表示用第几行作为表头,舍弃表头之前的行的数据,可以为(int, list of int, default 0)hearder=[1,2,3]:选择第2,3,4行的数据作为表头,第二行之上的数据不用header=None :表示不使用数据源中的表头
names=None(array-like, default None)表示自定义表头的名称,需要传递数组参数。
index_col=None(int, list of int, default None)指定列为索引列,默认为None,也就是索引为0的列用作DataFrame的行标签。
usecols=None(int, str, list-like, or callable default None)默认为None,解析所有列。如果为str,则表示Excel列字母和列范围的逗号分隔列表(例如“ A:E”或“ A,C,E:F”)。范围全闭。如果为int,则表示解析到第几列。如果为int列表,则表示解析那几列。
squeeze=False(bool, default False)默认为False。如果设置squeeze=True则表示如果解析的数据只包含一列,则返回一个Series。
dtype=None(Type name or dict of column -> type, default None)列的类型名称或字典,默认为None,也就是不改变数据类型。其作用是指定列的数据类型。dtype={0:"float64",2:str}设置第一列为float64类型,第三列为str类型
engine=None(str, default None)可以接受的参数有“ xlrd”,“ openpyxl”或“ odf”,用于使用第三方的库去解析excel文件。
converters=None(dict, default None)对指定列的数据进行指定函数的处理,传入参数为列名与函数组成的字典。key 可以是列名或者列的序号,values是函数,可以def函数或者直接lambda都行。
true_values=None(list,default None)将指定的文本转换为True,默认为None
false_values=None(list,default None)将指定的文本转换为False,默认为None
skiprows=None(list like)跳过指定的行。skiprows=1 跳过第1行skiprows=3 跳过前3行skiprows=[1,3,5] 跳过第1,3,5行skiprows=lambda x: x % 2 == 0 跳过偶数行
nrows=None(int, default None)指定需要读取前多少行,通常用于较大的数据文件中nrows=3 读取前三行
na_values=None(scalar, str, list-like, or dict, default None)指定某些列的某些值为NaN。na_values='大专',指定大专为NaN
keep_default_na=True(bool, default True)表示导入数据时是否导入空值。默认为True,即自动识别空值并导入
df3 = pd.read_excel('豆瓣电影数据.xlsx',index_col=0)

df3.head()
名字投票人数类型产地上映时间时长年代评分首映地点
0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
1控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
2美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利
3阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
4霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港

取数据

  • DataFrame.iloc[行号,列号]属性,用行号、列号来表示查看哪几行。若有多个,行号、列号需要分别是个列表。可以是索引形式,左闭右开
df3.iloc[:3]
  • DataFrame.loc[行标,列标]属性,用行标、列标来取数据,可以是索引形式,若有多个,行号、列号需要分别是个列表。,左闭右闭,如df.loc[:,['A','B']]

该属性有一种条件选择语法,即根据某个数据的值是否符合条件来提取数据

df.loc[df['A']==0][:5]#提取数据(筛选条件: A列中数字为0的数据所在的前5行)

df3.loc[:3]

在末尾添加行

DataFrame._append() -> DataFrame

会创建一个副本

参数说明
other: Any(DataFrame,Series,Iterable[DataFrame
ignore_index: bool = FalseCan only append a dict if ignore_index=True
verify_integrity: bool = False
sort: bool = False

注:DataFrame.append()即将弃用

定义要加入的行的字典

dit = {'名字':'复仇者联盟3','投票人数':'123456','类型':'剧情/科幻','产地':'美国','上映时间':'2018-05-04 00:00:00','时长':'142','年代':'2018','评分':'8.7','首映地点':'美国'}

转化为Series

sdit = pd.Series(dit)
sdit.name = 38738#name属性添加进DataFrame后就是行标
sdit

在末尾添加数据

df3 = df3._append(sdit)
df3[-5:]

增加一列

DataFrame['新列标'] = 一列的值(可以是列表等,也可以用range)

df3['序号'] = range(1, len(df3) + 1)

df3[:5]

删除行或列

DataFrame.drop() -> DataFrame

参数说明
labels一个字符或者数值,加上axis ,表示带label标识的行或者列;如 (labels=‘A’, axis=1) 表示A列
axis = 0维数,axis=0表示行,axis=1表示列
columns列名
index表示dataframe的index, 如index=1, index=a
inplace = FalseTrue表示删除某行后原dataframe变化,False不改变原始dataframe
# 删除一行
df3 = df3.drop([38738])

# 删除一列
#df3 = df3.drop('序号',axis=1)

# 选择性删除
# df3.drop(df3[df3['年代']>2023].index,inplace=True)

df3[-5:]

数据随机抽样

DataFrame.sample( self: NDFrameT, n: int | None = None, frac: float | None = None, replace: bool_t = False, weights=None, random_state: RandomState | None = None, axis: Axis | None = None, ignore_index: bool_t = False, ) -> DataFrame

sample 是 pandas 库中 DataFrame 和 Series 对象的一个方法,它用来从对象的指定轴返回随机样本。你可以使用 random_state 参数来保证可重复性。

下面是 sample 方法中每个参数的解释:

n: 要从轴返回的项目数。不能与 frac 一起使用。如果 frac 为 None,则默认为 1。

frac: 要返回的轴项目的比例。不能与 n 一起使用。

replace: 是否允许对同一行进行多次抽样。默认为 False。

weights: 权重。默认为 ‘None’,表示所有项目的概率相
等。如果传递一个 Series,则会根据索引与目标对象对齐。在权重中未找到的采样对象的索引值将被忽略,而在采样对象中未在权重中找到的索引值将被分配零权重。如果在 DataFrame 上调用,则当 axis = 0 时,将接受列名。除非权重是一个 Series,否则权重必须与被采样的轴长度相同。如果权重之和不为 1,则它们将被归一化为总和为 1。权重列中的缺失值将被视为零。不允许无限值。

random_state: 随机数生成器的种子。如果是 int、array-like 或 BitGenerator,则用作随机数生成器的种子。如果是 np.random.RandomState 或 np.random.Generator,则按给定方式使用。

返回值是一个新的 DataFrame 或 Series 对象。

可以通过将frac设为1来打乱数据顺序

缺失值以及异常值的处理

缺失值处理方法:

方法说明
dropna根据标签中的缺失值进行过滤,删除缺失值所在行
fillna对缺失值进行填充
isnull返回一个布尔值对象,判断哪些值是缺失值(缺失值为True)
notnullisnull的否定形式(非缺失值为True)

判断哪些值是缺失值/非缺失值

DataFrame.isnull() -> DataFrame

返回一个布尔值对象,判断哪些值是缺失值(缺失值为True)

DataFrame.notnull() -> DataFrame

isnull的否定形式(非缺失值为True)

df3[df3.名字.isnull()][:5]

填充缺失值

DataFrame.fillna(value, method, axis, inplace, limit, downcast) -> DataFrame

参数说明
value填充值
method
axis进行操作的维数
inplace = False是否直接使用原数据进行操作
limit
downcast

用均值填充:

df3.评分.fillna(np.mean(df.评分), inplace = True)

删除缺失值

DataFrame.dropna(axis, how, thresh, subset, inplace, ignore_index) -> DataFrame

参数说明
axis进行操作的维数
how = ‘any’(‘any’, ‘all’)any:存在NA(空)即删除all:全为NA才删除
threshint, optionalRequire that many non-NA values. Cannot be combined with how.
subsetcolumn label or sequence of labels, optional,Labels along other axis to consider, e.g. if you are dropping rowsthese would be a list of columns to include.
inplace = False是否使用原数据操作
ignore_indexIf True, the resulting axis will be labeled 0, 1, …, n - 1.

异常值处理

异常值,即在数起朱中存在不合理的恒,又你离群点。比如年龄为-1,笔记本电脑重量为1屯等,都属于异常值的范围。

对于异常值。一股来说数量都会很少,在不影响整体数据分布的情况下,我们直接删除就可以了。

其他属性的异常值处理,我们会在格式转换部分,进一步讨论。

因为删除了一些值以后,DataFrame的index已经不再连续,有必要的话,我们可以重新为它赋值使它连续:

df3.index = range(len(df3))

df3[(df3.投票人数 < 0 ) | ((df3.投票人数 % 1 )!= 0)]
名字投票人数类型产地上映时间时长年代评分首映地点
19777皇家大贼 皇家大-80.00剧情/犯罪中国香港1985-05-31 00:00:0060.019856.3美国
19786日本的垃圾去中国大陆 にっぽんの“ゴミ” 大陆へ渡る ~中国式リサイクル錬-80.00纪录片日本1905-06-26 00:00:0060.020047.9美国
19791女教师 女教8.30剧情/犯罪日本1977-10-29 00:00:00100.019776.6日本
19797女教徒-118.00剧情法国1966-05-06 00:00:00135.019667.8美国
19804女郎漫游仙境 ドレミファ娘の血は騒5.90喜剧/歌舞日本1985-11-03 00:00:0080.019856.7日本
19820女仆日记12.87剧情法国2015-04-01 00:00:0096.020155.7法国
38055逃出亚卡拉12.87剧情/动作/惊悚/犯罪美国1979-09-20 00:00:00112.019797.8美国

直接将数据覆盖

df3 = df3[(df3.投票人数 > 0 ) & (df3.投票人数 % 1 == 0)]
df3 = df3[df3.时长 < 2000]

替换数据

DataFrame.replace(to_replace,value,inplace,limit,regex,method) -> DataFrame

参数说明
to_replace=None要替换的值
value=lib.no_default用于替换的值
inplace: bool = False是否使用原数据进行操作
limit: intNone = None
regex: bool = False
method: Literal[“pad”, “ffill”, “bfill”] | lib.NoDefault = lib.no_default

数据保存

  • DataFrame.to_excel(io)
参数说明
io保存路径
  • DataFrame.to_csv()

  • DataFrame.to_json()

  • DataFrame.to_html()

等等

数据类型转换

在做数据分析的时候,原始数据往往会因为各种各样的原因产生各种数据类型的问题。
数据类型是我们非常需要注意的一点,数据类型错误往往会造成很严重的后果。
并且,很多异常值也是我们经过数据类型转换之后才会发现,对我们规整数据,清洗数据有着重要的作用。

查看数据类型

DataFrame[列标].dtype

只能查看一列(可以算作是是通过DataFrame[列标]得到Series后再dtype?)

df3['序号'].dtype

数据类型转换

DataFrame[列标].astype(dtype, copy) -> DataFrame

参数说明
dtype(str)目标数据类型
copybool, default TrueReturn a copy when copy=True (be very careful settingcopy=False as changes to values then may propagate to otherpandas objects).
print(df3.投票人数.dtype)
df3['投票人数'] = df3['投票人数'].astype('int')
print(df3.投票人数.dtype)

数据类型转换排错案列

将"年代"转换为int类型

首先执行df3.年代.astype("int")

得到报错ValueError: invalid literal for int() with base 10: ‘2008\u200e’

再查找该条目df3[df3.年代 = 2008\u200e]

print(df3[df3.年代 == '2008\u200e']['年代'])
print(df3[df3.年代 == '2008\u200e']['年代'].values)
15205    2008‎
Name: 年代, dtype: object
['2008\u200e']

替换该条目的"年代"字段

df3.loc[15205,'年代'] = 2008

再次将"年代"转换为int类型

df3.年代 = df3.年代.astype("int")

成功

同样的,再对其他有必要的列进行数据转换

df3.评分 = df3.评分.astype("float")
print(df3[df3.时长 == '8U']['时长'])
df3 = df3.drop([31644])
print(df3[df3.时长 == '12J']['时长'])
df3 = df3.drop([32949])
Series([], Name: 时长, dtype: object)
32949    12J
Name: 时长, dtype: object
df3.时长 = df3.时长.astype("float")

排序

按值排序

DataFrame.sort_values(by,ascending,axis,kind,inplace,ignore_index) -> DataFrame

该方法用于按指定列的值对DataFrame进行排序。

参数说明
by排序参照的列标,可以为列标的列表,表示按照列标在列表中的索引相对应的优先度进行排序
axis要排序的轴。可以是0或1,或者是’index’或’columns’。默认值为0。
ascending是否按升序排序。可以是布尔值或布尔值列表。默认值为True。
inplace是否在原地修改DataFrame。如果为True,则不返回任何值,而是直接修改原DataFrame。默认值为False。
kind排序算法。可以是’quicksort’、‘mergesort’或’heapsort’。默认值为’quicksort’。
na_position如何处理缺失值。可以是’first’或’last’。默认值为’last’。
ignore_index=False

按索引排序

DataFrame.sort_index(axis,level,ascending,inplace,kind,na_position,sort_remaining,ignore_index,key) -> DataFrame

参数说明
axis要排序的轴。可以是0或1,或者是’index’或’columns’。默认值为0。
level要排序的索引级别。可以是字符串、数字或字符串/数字列表。默认值为None。
ascending是否按升序排序。可以是布尔值或布尔值列表。默认值为True。
inplace是否在原地修改DataFrame。如果为True,则不返回任何值,而是直接修改原DataFrame。默认值为False。
kind排序算法。可以是’quicksort’、‘mergesort’或’heapsort’。默认值为’quicksort’。
na_position如何处理缺失值。可以是’first’或’last’。默认值为’last’。

基本统计分析

描述性统计

DataFrame.describe() -> DataFrame

对DataFrame中的数值型数据进行描述性统计

得到包含以下条目的DatuniqueaFrame:

条目描述
count总条目数
unique不同的值数
mean均值
std标准差
min最小值
25%处于从低到高25%位置处的数(25%分位数)
50%中位数
75%处于从低到高75%位置处的数(75%分位数)
max最大值
df3.describe()

很明显,可以通过描述性统计发现,有很多错误数据

求最值

  • DataFrame[列标].max(axis = 0, skipna = True, numeric_only = False) -> Any

求最大值

  • DataFrame[列标].min(axis = 0, skipna = True, numeric_only = False) -> Any

求最小值

求最值的索引

Series.idxmax() -> Series

获取最大值的索引

Series.idxmin() -> Series

获取最小值的索引

示例:

  • 得到一个series的最大值和它的index
# 创建一个 Series 对象
s = pd.Series([1, 3, 7, 2, 4])

# 获取最大值的索引
max_index = s.idxmax()

# 获取最大值
max_value = s.loc[max_index]

print(f"Max value: {max_value}, Index: {max_index}")
Max value: 7, Index: 2
  • 获取DataFrame中一行的最小值及其索引
# 创建一个 DataFrame 对象
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})

# 获取第一行数据
row = df.loc[0]

# 获取最小值的索引
min_index = row.idxmin()

# 获取最小值
min_value = row.loc[min_index]

print(f"Min value: {min_value}, Index: {min_index}")
Min value: 1, Index: A

求均值和中值

  • DataFrame[列标].mean(axis = 0, skipna = True, numeric_only = False) -> Any

求均值

  • DataFrame[列标].median(axis = 0, skipna = True, numeric_only = False) -> Any

求中位数

求方差和标准差

  • DataFrame[列标].var(axis = 0, ddof = 1,skipna = True, numeric_only = False) -> Any

求方差

  • DataFrame[列标].std(axis = 0, ddof = 1,skipna = True, numeric_only = False) -> Any

求标准差

求和

  • DataFrame[列标].sum(axis = 0,skipna = True, numeric_only = False) -> Any

求和

求相关系数和协方差

  • DataFrame[['列标1', '列标2']].corr(method: CorrelationMethod = "pearson",min_periods = 1,numeric_only = False) -> DataFrame

求两列的相关系数

  • DataFrame[['列标1', '列标2']].cov(min_periods = None,ddof = 1,numeric_only = False,)-> DataFrame

求两列的协方差

df3[['投票人数', '评分']].corr()

计数

  • len(DataFrame) -> int

求总数据条目数

  • DataFrame['列标'].unique() -> ndarray

求所有唯一值

  • len(DataFrame['列标'].unique()) -> int / DataFrame['列标'].nunique() -> DataFrame

求唯一值数目

可以通过求唯一值发现一些错误,在上面的数据里,产地中包含了一些重复的数据,例如美国和USA,德国和西德,俄罗斯和苏联
我们可以通过数据替换的方法将这些相同国家的电影数据合并一下。

df3['产地'].replace('USA','美国', inplace = True)
df3['产地'].replace(['西德','苏联'],['德国','俄罗斯'], inplace = True)
df3['产地'].unique()
df3['产地'].nunique()
  • DataFrame['列标'].value_counts(subset,normalize,sort,ascending,dropna) -> Series

对一列中每个唯一值计算出现次数,默认降序排列

参数说明
subset: Sequence[Hashable] | None = None用于计算唯一组合的列标签或标签列表。
normalize: bool = False如果为 True,则返回比例而不是频率,默认值为 False。
sort: bool = True按频率排序,默认值为 True。
ascending: bool = False按升序排序,默认值为 False。
dropna: bool = True不包括包含 NA 值的行的计数,默认值为 True。

数据透视

创建数据透视表

pandas.pivot_table(data,values,index,columns,aggfunc,fill_value,margins,dropna,margins_name,observed,sort: bool = True) -> DataFrame

也可以用方法:DataFrame.pivot_table() -> DataFrame,它没有data参数

pivot_table 是 pandas 库中的一个函数,它可以从给定的 DataFrame 中创建一个类似于电子表格的数据透视表。使用数据透视表,我们可以快速分析数据,并且它可以提供更多的灵活性来制作给定 DataFrame 的 Excel 表单形式。它可以将数值列与两个分类列进行交叉汇总1。

参数说明
data: DataFrame必需,表示要使用的 DataFrame。
values: Any = None可选,表示要聚合的列。可以用列表指定多个,默认为全部数值型列
index: Any = None可选,表示在数据透视表索引(行)上分组的键。
columns: Any = None可选,表示在数据透视表列上分组的键。
aggfunc: (…) -> Any | str | list[(…) -> Any | str] | dict[Hashable, (…) -> Any | str | list[(…) -> Any | str]] = “mean”可选,默认为 ‘mean’,表示聚合函数。
fill_value: Any = None可选,用于替换缺失值(或不可计算值)的值。
margins: bool = False可选,默认为 False。如果为 True,则添加特殊的“总计”列和行。
dropna: bool = True可选,默认为 True。如果为 True,则不包含所有条目都为 NaN 的列。
margins_name: Hashable = “All”可选,默认为 ‘All’。当 margins 为 True 时包含总计的行/列的名称。
observed: bool = False可选,默认为 False。仅当任何分组器为分类时适用。
sort: bool = True可选,默认为 True。指定结果是否应排序。

以指定列对所有数值型列创建一个均值透视表

pd.pivot_table(df3,index=["年代","产地"],values="投票人数",aggfunc="sum")
pd.pivot_table(df3,index="产地",values=["投票人数","评分"],aggfunc=[np.sum, np.mean],fill_value=0,margins=True)

透视表过滤

把得到的透视表赋值,当作新的DataFrame进行操作,可以选择性的查看所需要的数据、进行排序或者进行其他操作

数据重塑和轴向旋转

层次化索引

Series和DataFrame可以有多个索引,层次化索引的实现是把index中靠前的索引中,相同的索引合并起来,类似于excel合并单元格,达到层次化的效果

Serie只有一个维度,只可以在这个维度上进行层次化索引,DataFrame可以在行和列上都进行层次化索引

s = pd.Series(np.arange(1,10),index=[['a','a','a','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,1]])
s
s.index

层次化索引在取值时可以用逗号隔开不同层次的索引

s['a']
s['a':'c']
s[:,1]

层次化索引展开与堆叠

展开

DataFrame.unstack(self, level: Level = -1, fill_value=None) -> DataFrame

Series.unstack(self, level: Level = -1, fill_value=None) -> DataFrame

将多层索引展开得到一个新DataFrame,不同层次的索引会作为不同的轴。

series通过unstack转成DataFrame有时会产生缺失值

s.unstack()
堆叠

DataFrame.stack(self, level: Level = -1, dropna: bool = True) -> DataFrame

Series.stack(self, level: Level = -1, fill_value=None) -> DataFrame

将不同的轴的索引堆叠为层次化索引

s.unstack().stack()
DataFrame层次化索引的创建

行索引通过设置index值,列索引通过设置column值

data = pd.DataFrame(np.arange(12).reshape(4,3),index=[['a','a','b','b',],['1','2','1','2']],columns=[['A','A','B'],['x','y','z']])

data
层次化索引的命名

之前我们知道可以通过设置names属性为索引命名,层次化索引可以为每个层次的索引分别命名

data.index.names=['row1','row2']
data.columns.names=['col1','col2']

data
交换俩个层次索引的层次

DataFrame.swaplevel(self, i: Axis = -2, j: Axis = -1, axis: Axis = 0) -> DataFrame

Series.swaplevel(self, i: Axis = -2, j: Axis = -1, axis: Axis = 0) -> DataFrame

返回互换了级别i和j的新对象,不改变原数据,i和j可以是索引所在的层次,也可以是是索引的名称

data.swaplevel('row1','row2')
索引排序

DataFrame.sort_index() -> DataFrame

参数等用到了再查

将列设置为索引

DataFrame.set_index(keys: Any,drop: bool = True,append: bool = False,inplace: bool = False,verify_integrity: bool = False) -> DataFrame

keys传入设置为索引的列名列标,以按顺序构建层次化索引

df3=df3.set_index(['产地','年代'])
df3

每一个索引都是一个元组

df3.index[0]
df3.loc[('美国',1994),['名字','评分']]
data.columns
取消层次化索引

DataFrame.reset_index() -> DataFrame

df3 = df3.reset_index()
df3

行列转换

DataFrame.T -> DataFrame

df3[:5].T

数据分组、分组运算

可以做到类似于数据透视表的效果,会更方便点

DataFrame.groupby(by,axis,level,as_index,sort,group_keys,observed,dropna,) -> DataFrameGroupBy

得到的DataFrameGroupBy对象可以使用基本统计分析的方法进行数据计算和分析

参数说明
by=None用于确定 groupby 的组。可以是Seires、映射、函数、标签、pd.Grouper 或这些的列表。
axis: Axis = 0要分组的轴。默认为0。
level: IndexLabelNone = None
as_index: bool = True是否将分组键作为索引返回。默认为True。
sort: bool = True是否对分组键进行排序。默认为True。
group_keys: bool = True是否在应用函数时添加组键作为索引。默认为True。
observed: bool = False如果此参数为True,则仅使用分类数据中观察到的类别进行分组。默认为False。
dropna: bool = True如果此参数为True,则删除所有NaN观察值。默认为True。
#对评分按年代分组
#df3["评分"].groupby(df3['年代']).mean()

df3.loc[:,["评分","投票人数"]].groupby([df3['产地'],df3['年代']]).mean()

离散化处理

在实际的数据分析项目中,对有的数据属性,我们往往并不关注数据的绝对取值,只关注它所处的区间或者等级。

离散化也可称为分组、区间化。
Pandas提供了方便的函数cut():

pandas.cut(x,bins,right,labels.retbins,precision,include_lowest,duplicates)-> Series

返回值是一个分类对象。

参数说明
x要被切分的类数组(array-like)数据(可以是Series、DataFrame对象),必须是1维的。
bins被切割后的区间(或者叫“桶”、“箱”、“面元”),有3种形式:一个int型的标量、标量序列(数组)或者pandas.IntervalIndex。如果填入整数n,则表示将x中的数值分成等宽的n份(即每一组内的最大值与最小值之差约相等);如果是标量序列,序列中的数值表示用来分档的分界值。
right=True布尔值,默认为True表示包含最右侧的数值。
labels=None数组或布尔值,可选。指定分箱的标签。如果是数组,长度要与分箱个数一致;如果为False,则仅返回分箱的整数指示符,即x中的数据在第几个箱子里。
retbins=False布尔值,可选。是否显示分箱的分界值。
precision=3整数,默认3,存储和显示分箱标签的精度。
include_lowest=False布尔值,表示区间的左边是开还是闭,默认为false,也就是不包含区间左边。
duplicates=True如果分箱临界值不唯一,则引发ValueError或丢弃非唯一。
df3['评分等级'] = pd.cut(df3['评分'],[0,3,5,7,9,10],labels=['E','D','C','B','A'])

#定义分隔的区间,此处是得到投票人数处于百分数处的值
#结果为:array([-118.0, 78.0, 198.0, 617.0, 2746.0, 692795.0], dtype=object)
bins = np.percentile(df3['投票人数'],[0,20,40,60,80,100])

#离散化
df3["热门程度"] = pd.cut(df3['投票人数'],bins,labels=['E','D','C','B','A'])

df3

可以通过此得到冷门高分电影

df3[(df3.热门程度=='E')&(df3.评分等级=='A')]

合并数据集

  • DataFrame._append(DataFrame)

将参数中的DataFrame上下合并进数据,这就要求所有列标都对的上。

通常用于因为数据量太大,存在了多个excel表格中,读取时进行的合并。

该方法会直接修改原数据。

  • pandas.merge(left,right,how,on,left_on,right_on,left_index,right_index,sort,suffixes,copy,indicator,validate) -> DataFrame

也可以使用方法DataFrame.merge() -> DataFrame,相应的没有left参数,其他一样。

参数说明
left要合并的第一个 DataFrame 或 Series 对象。
right要合并的第二个 DataFrame 或 Series 对象。
how合并方式。可选值为 “left”, “right”, “inner”, “outer” 和 “cross”。默认为 “inner”。“left”: 左连接,仅保留左侧 DataFrame 中的键。“right”: 右连接,仅保留右侧 DataFrame 中的键。“inner”: 内连接,仅保留两个 DataFrame 中都存在的键。“outer”: 外连接,保留两个 DataFrame 中所有的键。“cross”: 交叉连接,返回两个 DataFrame 的笛卡尔积。
on用于连接的列名。必须在两个 DataFrame 对象中都存在。如果未指定,则默认为两个 DataFrame 对象中都存在的列名的交集。
left_on左侧 DataFrame 中用于连接的列名。
right_on右侧 DataFrame 中用于连接的列名。
left_index如果为 True,则使用左侧 DataFrame 的索引作为连接键。默认为 False。
right_index如果为 True,则使用右侧 DataFrame 的索引作为连接键。默认为 False。
sort按照连接键对结果 DataFrame 进行排序。默认为 False。
suffixes用于重叠列名的字符串后缀元组。默认为 (“_x”, “_y”)。
copy如果为 True,则总是从传递的 DataFrame 对象复制数据(注意,避免复制可能会影响在其他地方使用的数据)。默认为 None,表示仅在必要时才复制数据。
indicator如果为 True,则在输出 DataFrame 中添加一列名为 _merge 的 Categorical 类型列,用于指示合并情况。如果传递字符串,则该字符串将用作列名。默认为 False。
validate如果指定,则检查合并键上是否存在重复项。可选值有 “one_to_one”、“one_to_many” 或 “many_to_one”。 “one_to_one”: 检查合并键在左侧和右侧 DataFrame 中都是唯一的。“one_to_many”: 检查合并键在左侧 DataFrame 中是唯一的。“many_to_one”: 检查合并键在右侧 DataFrame 中是唯一的。如果检查失败,则会引发一个 MergeError 异常。
  • pandas.concat(objs: Iterable[NDFrame] | Mapping[HashableT, NDFrame],*,axis: Axis = 0,join: str = "outer",ignore_index: bool = False,keys=None,levels=None,names=None,verify_integrity: bool = False,sort: bool = False,copy: bool | None = None,)

批量合并数据

参数说明
objs要连接的 pandas 对象序列或映射。如果传递了映射,则连接的键将用作结果对象中的键。
axis要连接的轴。默认为 0。
join连接方式。可选值为 “outer” 和 “inner”。默认为 “outer”。
ignore_index如果为 True,则不使用连接轴上的索引值。结果轴将被重新索引为默认整数索引。默认为 False。
keys用于构造分层索引的序列,默认为 None。如果传递了多个级别,则应该包含元组。
levels指定用于构造分层索引的级别,默认为 None。
names用于结果轴的名称列表,默认为 None。
verify_integrity如果为 True,则检查新连接的轴是否包含重复项。如果检查失败,则会引发异常。默认为 False。
sort按字典顺序对非连接轴进行排序,以避免在连接时重新排序。默认为 False。
copy如果为 True,则总是从传递的 DataFrame 对象复制数据(注意,避免复制可能会影响在其他地方使用的数据)。默认为 None,表示仅在必要时才复制数据。

如:df = pd.concat([df1,df2,df3])

Matplotlib

matplotlib是一个Python的2D图形包。pyplot封装了很多画图的函数。

导入相关的包:

import matplotlib.pyplot as plt

import matplotlib.mlab as mlab

import matplotlib.pyplot as plt

matplotlib.pyplot包含一系列类似MATLAB中绘图函数的相关函数。每个matplotlib.pyplot中的函数对当前的图像进行一些修改,例如:产生新的图像,在图像中产生新的绘图区域,在绘图区域中画线,给绘图加上标记,等等.…matplotlib.pyplot会自动记住当前的图像和绘图区域,因此这些函数会直接作用在当前的图像上。

在实际的使用过程中,常常以plt作为matplotlib.pyplot的省略。

除此之外,还有一个包: mlab

import matplotlib.mlab as mlab

设置参数以正常显示中文和负号等内容

  • plt.rcParams['font.sans-serif'] = ['SimHei']设置字体为黑体(以正常显示中文)

  • plt.rcParams['axes.unicode_minus'] = False设置正常显示负号

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

关闭警告

import warnings
warnings.filterwarnings('ignore')

这样就不会跳出一些关于函数即将弃用和函数即将被取代的警告了

展示图象

plt.show0函数

默认情况下,matplotlib.pyplot不会直接显示图像,只有调用plt.show0函数时,图像才会显示出来。

plt.sow0默认是在新窗口打开一幅图像,并且提供了对图像进行操作的按钮。

不过在ipython命令行中,我们可以使用魔术命令将它插入到notebook中,并目不需要调用plt.show()也可以显示:

  • %matplotlib notebook

  • %matplotlib inline

不过在实际写程序中,我们还是习惯调用plt.show()函数将图像显示出来。

绘制线型图

plt.plot(*args: Any, scalex: bool = True, scaley: bool = True, data: Any = None, **kwargs: Any) ->

参数说明
*args一组表示 x 和 y 坐标的位置参数。先x后y。可以是多种形式,例如两个一维数组 xy,或者一个二维数组 y。如果不指定x坐标,则自动以索引为x坐标。
scalex如果为 True,则自动缩放 x 轴。默认为 True。
scaley如果为 True,则自动缩放 y 轴。默认为 True。
data可选参数。如果给定,则使用它来构造默认变量。
**kwargs一组关键字参数,用于控制线条的外观和其他绘图选项。

返回值是一个Line2D对象或多个Line2D对象的列表,表示绘制的线条。

可以通关循环式的传入参数来绘制多条线

plt.plot([1, 2, 3, 3])

plt.show()

temp = np.arange(0,5,0.2)

plt.plot(temp,temp,"r--",
        temp,np.e**temp,
        temp,temp**3,"g:d")

plt.show()

添加标题

plt.title(label, fontdict=None, loc=None, pad=None, *, y=None, **kwargs)

参数描述
label此参数接受一个字符串,表示要应用的标题。
fontdict此参数允许您为标题文本指定字体属性。
loc此参数控制文本的位置。
pad此参数控制标题与轴顶部的偏移量。
y此参数控制标题的垂直对齐方式。
**kwargs允许您传递任意数量的关键字参数,以进一步自定义标题。

**kwargs参数支持的关键字参数:

参数描述
fontsize控制字体大小。
fontweight控制字体粗细。
fontstyle控制字体样式。
fontfamily控制字体族。
color控制文本颜色。
  • fontstyle参数用于控制字体样式。它可以接受以下值之一:
描述
‘normal’正常字体。
‘italic’斜体。
‘oblique’倾斜字体。
  • fontfamily参数用于控制字体族。它可以接受以下值之一:
描述
‘serif’衬线字体。
‘sans-serif’无衬线字体。
‘cursive’草书字体。
‘fantasy’幻想字体。
‘monospace’等宽字体。
  • color参数用于控制文本颜色。它可以接受多种格式的颜色值,包括:
格式示例
十六进制RGB或RGBA字符串'#FF0000'
RGB或RGBA元组(1, 0, 0)
灰度值的字符串表示形式'0.5'
单个字符的简写表示法'r'
不带空格的X11/CSS4颜色名称'red'

指定x坐标名称和y坐标名称

  • plt.ylabel(ylabel, fontdict=None, labelpad=None, *, loc=None, **kwargs)

指定y坐标名称

参数解释
ylabely 轴标签的文本。
fontdict可选字典,用于控制文本的外观。支持的键包括 ‘fontsize’、‘fontweight’ 等。
labeyylpad标签与轴之间的间距(以点为单位)。默认为 None,表示使用 rcParams[“axes.labelpad”] 的值。
loc标签位置。可选值为 ‘center’、‘top’ 和 ‘bottom’。默认为 None,表示使用 xrcParams[“yaxis.labellocation”] 的值。
**kwargs一组关键字参数,用于控制文本的外观。
  • plt.xlabel(xlabel, fontdict=None, labelpad=None, *, loc=None, **kwargs)

指定x坐标名称

参数同plt.ylabel()

plt.plot([1,2,3,4],[1,4,9,16])

plt.xlabel("x")
plt.ylabel("y")

plt.show()

线条样式控制

线条样式控制可以通过在绘制图片的函数的参数中加入字符串参数来实现,在参数定义中为**kwargs

参数说明
color修改颜色,可以简写成c
linestyle修改线条的样式 可以简写成 ls
marker标注(点型)
linewidth设置线条粗细 可以简写成 lw (lw=2)
markeredgecolor点边缘的颜色
markeredgewidth点边缘粗细
markeredgecolor点内部颜色
markersize点的大小

下面是各个参数可选的字符:

颜色:

marker点型:

线条样式:

用法:
plt.plot([1,2,3,4],[1,4,9,16],c='r',linestyle='--',marker='o')

也可以直接用一个字符:

plt.plot([1,2,3,4],[1,4,9,16],'r--o')

plt.plot([1,2,3,4],[1,4,9,16],'r--o')

plt.show()

线条属性设置

可以通过绘图函数返回的Line2D对象来设置线条属性

  • Line2D.set_antialiased()是否抗锯齿,该属性默认为True

也可以使用plt.setp(obj: Any, *args: Any, **kwargs: Any) -> list[Any | None] | None函数来设置

temp2 = np.linspace(-np.pi,np.pi)

line1, line2 = plt.plot(temp2, np.sin(temp2), temp2, np.sin(temp2) + 1)

# 关闭抗锯齿
line2.set_antialiased(False)

# 设置线条宽度为5
plt.setp(line2, linewidth=5)

# 使用MatLab风格的参数
plt.setp(line2, 'color','r','linestyle','--')

plt.show()

显示范围控制

plt.axis([xmin, xmax, ymin, ymax])

plt.plot([1,2,3,4],[1,4,9,16],'r--o')
plt.axis([0, 6, 0, 20])

plt.show()

设置刻度线样式

plt.tick_params(axis, which, reset, **kwargs)

该函数用于更改刻度线、刻度标签和网格线的外观。除非resetTrue,否则未使用关键字参数显式设置的刻度属性将保持不变。有关当前样式设置,请参阅Axis.get_tick_params

参数说明
axis='both'应用参数的轴。可以是 'x''y''both'。默认值为 'both'
which='major'应用参数的刻度组。可以是 'major''minor''both'。默认值为 'major'
reset=False是否在处理其他关键字参数之前将所有参数重置为默认值。
**kwargs其他关键字参数。

该函数的**kwargs参数支持以下关键字参数:

参数说明
direction刻度线的方向。可以是 'in''out''inout'
length刻度线的长度(以点为单位)。
width刻度线的宽度(以点为单位)。
color刻度线的颜色。
pad刻度线和标签之间的距离(以点为单位)。
labelsize刻度标签的字体大小(以点为单位),也可以是字符串(例如 'large')。
labelcolor刻度标签的颜色。
colors刻度线和标签的颜色。
zorder刻度线和标签的zorder。
bottom, top, left, right是否绘制相应的刻度线。
labelbottom, labeltop, labelleft, labelright是否绘制相应的刻度标签。
labelrotation刻度标签旋转角度。
grid_color网格线颜色。
grid_alpha网格线透明度:0(透明)到1(不透明)。
grid_linewidth网格线宽度(以点为单位)。
grid_linestyle任何有效的Line2D线条样式规范。

设置横纵标签样式

  • plt.xticks(ticks, labels, **kwargs)

该函数用于获取或设置x轴的刻度位置和标签。如果不传递任何参数,则返回当前值而不修改它们。

  • plt.yticks(ticks, labels, **kwargs)

该函数用于获取或设置y轴的刻度位置和标签。如果不传递任何参数,则返回当前值而不修改它们。

参数说明
ticks刻度位置的数组。如果传递一个空列表,则删除所有xticks。
labels要放置在给定刻度位置的标签。
**kwargs用于控制标签外观的文本属性。

该函数的**kwargs参数支持文本属性,用于控制标签的外观。这些属性包括:

参数说明
fontsize字体大小。
fontweight字体粗细。
fontstyle字体样式。
fontfamily字体族。
color文本颜色。
rotation文本旋转角度。

添加文本

plt.text(x, y, s, fontdict, **kwargs)

该函数用于在坐标轴上添加文本。它将文本s添加到数据坐标中的位置xy

参数说明
x文本的x坐标。
y文本的y坐标。
s要添加的文本。
fontdict用于覆盖默认文本属性的字典。如果fontdictNone,则默认值由rcParams确定。
**kwargs文本属性。

该函数的**kwargs参数支持文本属性,用于控制文本的外观。这些属性包括:

参数说明
fontsize字体大小。
fontweight字体粗细。
fontstyle字体样式。
fontfamily字体族。
color文本颜色。
rotation文本旋转角度。
horizontalalignment可以简写为ha,水平对齐方式。可以是 'left''center''right'
verticalalignment可以简写为va,垂直对齐方式。可以是 'top''center''bottom'

添加箭头注释点

plt.annotate()

该函数用于向图表添加注释。

参数说明
text注释文本
xy要注释的点 (x, y)
xytext文本位置 (x, y)。如果为 None,则默认为 xy
xycoordsxy 所给出的坐标系
textcoordsxytext 所给出的坐标系。如果为 None,则默认为 xycoords
arrowprops绘制从文本到被注释点的箭头的属性字典
annotation_clip当被注释点在轴区域外时是否绘制注释
**kwargs其他关键字参数

arrowprops 参数支持的关键字参数及其值:

关键字参数
width箭头宽度(以点为单位)
headwidth箭头底部宽度(以点为单位)
headlength箭头长度(以点为单位)
shrink从两端收缩的总长度的百分比
facecolor箭头颜色
edgecolor箭头边缘颜色
arrowstyle箭头样式
connectionstyle箭头连接样式
relpos箭头相对于文本的位置

此函数返回一个注释对象。

网格线设置

plt.grid()

该函数用于配置网格线。它接受以下参数:

参数说明
visible是否显示网格线。如果提供了任何kwargs,则假定您希望网格打开且visible将设置为True。如果visibleNone且没有kwargs,则切换线的可见性。
which应用更改的网格线。可以是 'major', 'minor', 或 'both'. 默认值为 'major'.
axis应用更改的轴。可以是 'both', 'x', 或 'y'. 默认值为 'both'.
**kwargsLine2D属性,用于定义网格线的线条属性,例如:grid(color=‘r’, linestyle=‘-’, linewidth=2)

绘制图例

plt.legend()

该函数用于在当前坐标轴上添加图例。下面是对它的参数的解释:

参数默认值说明
handlesNone要添加到图例中的艺术家(线条,补丁)列表
labelsNone要显示在艺术家旁边的标签列表
loc'best'图例的位置
ncol1图例中的列数
fontsize'medium'字体大小
titleNone图例标题

loc 参数可以取多种值来控制图例的位置。下面是一些可用的值:

说明
'best'让 matplotlib 自动选择最佳位置
'upper right'将图例放在坐标轴的右上角
'upper left'将图例放在坐标轴的左上角
'lower left'将图例放在坐标轴的左下角
'lower right'将图例放在坐标轴的右下角
'right'将图例放在坐标轴的右侧
'center left'将图例放在坐标轴的左侧中央
'center right'将图例放在坐标轴的右侧中央
'lower center'将图例放在坐标轴的底部中央
'upper center'将图例放在坐标轴的顶部中央
'center'将图例放在坐标轴的中心

改变背景色

ax = plt.gca()

获取当前的坐标系对象

ax.patch.set_facecolor('gray')

将背景色设置为灰色

ax.set_alpha(0.3)

设置背景透明度为0.3

子图

  • plt.figure(num,figsize,dpi,facecolor,edgecolor,frameon,FigureClass,clear,**kwargs)

figure 是一个函数,它用于创建一个新的图形或激活(表示现在要对指定的一个图象进行操作)现有图形。它接受以下参数:

参数说明
num=None图形编号,如果为 None 则自动递增,否则为 1-N 的整数
figsize=None图形大小,默认为 rc figure.figsize
dpi=None分辨率,默认为 rc figure.dpi
facecolor=None图形背景颜色,默认为 rc figure.facecolor
edgecolor=None图形边框颜色,默认为 rc figure.edgecolor
frameon=True是否绘制图形边框,默认为 True
FigureClass=Figure图形类,默认为 Figure
clear=False如果为 True,则清除现有图形,默认为 False
**kwargs其他关键字参数
  • plt.subplot(numrows,numcols,fignum)

subplot函数用于在一个图形中创建多个子图。它接受以下参数:

一般会用到的参数:

参数说明
numrows=1子图网格的行数
numcols=1子图网格的列数
fignum选择对第几个子图进行做题,子图的编号为从1开始,从左到右,从上到下依次递增。

详细参数:

参数说明
nrows=1子图网格的行数
ncols=1子图网格的列数
sharex=False控制 x 轴的属性共享。可以是布尔值或 {‘none’, ‘all’, ‘row’, ‘col’} 中的一个,默认值为 False。
sharey=False控制 y 轴的属性共享。可以是布尔值或 {‘none’, ‘all’, ‘row’, ‘col’} 中的一个,默认值为 False。
squeeze=True是否从返回的 Axes 数组中挤出额外的维度
subplot_kw=None传递给用于创建每个子图的 add_subplot 调用的关键字参数字典
gridspec_kw=None传递给用于创建子图所放置的网格的 GridSpec 构造函数的关键字参数字典
**fig_kw所有其他关键字参数都传递给 pyplot.figure 调用

返回值为一个包含图形和 Axes 对象(或 Axes 对象数组)的元组。您可以使用这些对象来自定义子图的布局和外观。

当numrows*numcols < 10时,中间的逗号可以省略,因此plt.subplot(211)就相当于plt.subplot(2,1,1)。

def f(t):
    return np.exp(-t)*np.cos(2*np.pi*t)

t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)

# 创建一张图
plt.figure(figsize=(5,6))

# 告诉电脑这张图的子表为2*1,并且选择第一个子表
plt.subplot(211)

#对第一个子表进行绘制
plt.plot(t1,f(t1),'bo', t2, f(t2), 'k')

# 告诉电脑这张图的子表为2*1,并且选择第二个子表
plt.subplot(212)

#对第二个子表进行绘制
plt.plot(t2, np.cos(2*np.pi*t2),'r--')

plt.show()

绘制柱状图

plt.bar(x,height,width,bottom,align,data,**kwargs)

该函数用于在当前坐标轴上创建条形图。

参数说明
x条形的 x 坐标
height条形的高度
width=0.8条形的宽度
bottom=None条形的 y 坐标
align='center'条形的对齐方式,可以是 ‘center’ 或 ‘edge’,默认值为 ‘center’。
data=None可选参数,用于构造默认数据
**kwargs其他关键字参数

该函数返回一个由当前坐标轴上的条形组成的容器 。

data = df3['产地'].value_counts()
data
美国      11866
日本       5053
中国大陆     3803
中国香港     2852
法国       2817
英国       2763
其他       1920
韩国       1351
德国        902
意大利       749
加拿大       723
中国台湾      618
西班牙       447
印度        357
澳大利亚      300
泰国        294
苏联        256
俄罗斯       221
丹麦        198
瑞典        194
波兰        181
荷兰        155
比利时       139
西德        130
墨西哥       119
阿根廷       116
USA       113
巴西        101
Name: 产地, dtype: int64
# 定义x轴
x=data.index

# 定义y轴
y=data.values

# 创建图象
plt.figure(figsize=(10,6))

# 绘制图象
plt.bar(x,y,color='g')

# 设置
plt.title('各国家或地区电影数量', fontsize=20)

plt.xlabel('国家或地区', fontsize=18)
plt.ylabel('电影数量', fontsize=18)

plt.tick_params(labelsize=14)

plt.xticks(rotation=90)

# 添加详细数据的显示
for a, b in zip(x, y):
    plt.text(a, b, b, ha = 'center', va = 'bottom', fontsize = 10)

plt.show()

绘制折线(线型)图,参数见上方绘制线型图

plt.plot()

绘制线型图

data = df3['年代'].value_counts()
data = data.sort_index()[:-3]#去除包括2016年的不合理数据,2016年只记录了几个月的数据,其他年份都记录了一年的数据
data
1888       2
1890       1
1892       1
1894       3
1895       8
        ... 
2011    1866
2012    2042
2013    2001
2014    1887
2015    1592
Name: 年代, Length: 125, dtype: int64
data.max()
2042
x = data.index
y = data.values

plt.plot(x,y,color='b')

plt.title('每年电影数据', fontsize=20)

plt.xlabel('年份', fontsize=18)
plt.ylabel('电影数量', fontsize=18)

# 每隔十年显示具体数值
for a, b in zip(x[::10], y[::10]):
    plt.text(a, b+10, b, ha = 'center', va = 'bottom', fontsize = 10)

# 绘制注释
plt.annotate(str(data.idxmax())+'年达到最大值', xy=(data.idxmax(),data.max()),xytext=(data.idxmax(),data.max()+300), arrowprops=dict(facecolor='white', edgecolor='red'))

plt.show
<function matplotlib.pyplot.show(close=None, block=None)>

绘制饼图

plt.pie(x, explode, labels, colors, autopct, pctdistance, shadow, labeldistance, startangle, radius, counterclock, wedgeprops, textprops, center, frame, rotatelabels, *, normalize, hatch, data)

参数说明
x饼图每个扇形的大小,可以使用归一化后的数据,也可以使用未归一化(sum(x)>1)的数据,未归一化的数据会自动使用sum(x)归一化
explode=None每个扇形与中心的偏移量
labels=None每个扇形的标签
colors=None每个扇形的颜色
autopct=None用于标记每个扇形百分比的字符串或函数,'%1.1f’指小数点前后位数(没有用空格补齐)
pctdistance=0.6百分比标记与中心的距离相对于半径的比例
shadow=False是否绘制阴影
labeldistance=1.1标签与中心的距离相对于半径的比例,<1会绘制在饼图内侧
startangle=0起始角度,以 x 轴正方向为 0 度,逆时针旋转
radius=1饼图半径
counterclock=True是否逆时针绘制饼图
wedgeprops=None扇形属性字典
textprops=None文本属性字典
center=(0,0)饼图中心位置
frame=False是否绘制轴框架
rotatelabels=False是否旋转每个标签到指定角度
normalize=True是否将 x 归一化为和为1
hatch =None每个扇形的阴影填充样式
data=None可选参数,用于构造默认数据

返回值:如果没有设置autopct,.返回(patches, (标注的文字的可迭代对象))
如果设置autopct,返回(patches, texts(标注的文字的可迭代对象), autotexts(百分比文字的可迭代对象))

可以通过返回值对各个文字进行设置

data = pd.cut(df3['时长'],[0,60,90,110,1000]).value_counts()
data
(90, 110]      13233
(0, 60]        10324
(60, 90]        7727
(110, 1000]     7450
Name: 时长, dtype: int64
y = data.values
# y = y/sum(y)

# 绘制饼图
plt.figure(figsize=(7,7))
plt.title('电影时长占比',fontsize=15)
patches, text_1, text_p = plt.pie(y, labels=data.index, autopct='%.1f %%', colors='bygr', startangle=90, shadow=True)

# 设置文字属性
for i in text_p:
    i.set_size(15)
    i.set_color('w')
    
for i in text_1:
    i.set_size(15)
    i.set_color('r')

# 绘制图例
plt.legend(loc='upper left')

plt.show()

直方图

plt.hist()

该函数的参数非常多,但常用的就这六个,只有第一个是必须的,后面可选

参数说明
arr需要计算直方图的一维数组
bins直方图的柱数,可选项,默认为10
normed是否将得到的直方图向量归一化。默认为0
facecolor直方图领色
edgecolor直方图边框颜色
alpha透明度
histtype直方图类型’bar’,barstacked’,‘step’,‘stepfilled’

返回值:

n:直方图向量,是否归一化由参数normed设定

bins:返回各个bin的区间范围

patches:返回每个bin里面包含的数据,是一个list

可以通过返回值设置各种属性

plt.figure(figsize=(10,6))
plt.hist(df3['评分'],bins=20,edgecolor='k',alpha=0.5)
plt.show()

可以看到,电影评分是个左偏的正态分布

绘制双轴图

注:之前我们是使用api方式进行的绘图,在这里,我们使用面向对象方式绘图

ax2=ax1.twinx()

生成共用x轴,不共用y轴的图象

from scipy.stats import norm

fig=plt.figure(figsize=(10,6))
ax1=fig.add_subplot(111)
n, bins, patches = ax1.hist(df3['评分'],bins=100,color='m')

ax1.set_ylabel('电影数量',fontsize=15)
ax1.set_xlabel('评分',fontsize=15)
ax1.set_title('频率分布图',fontsize=20)

# 计算正态概率密度函数
#scipy.stats.norm.pdf(bins,mu,sigma)
y=norm.pdf(bins,df3['评分'].mean(),df3['评分'].std())

# 生成与ax1共用x轴,不共用y轴的图象
ax2=ax1.twinx()

ax2.plot(bins,y,'b--')
ax2.set_ylabel('概率分布', fontsize=15)

plt.show()

绘制散点图

plt.scatter()

该函数用于在当前坐标轴上创建散点图。下面是对它的参数的解释:

参数说明
xx 坐标数据
yy 坐标数据
s=None点的大小(以点为单位)
c=None点的颜色
marker=None点的形状
cmap=None颜色映射表
norm=None归一化方法,用于将数据映射到 [0,1] 区间
vmin=None颜色映射表的最小值
vmax=None颜色映射表的最大值
alpha=None透明度
linewidths=None线宽
edgecolors=None边缘颜色
plotnonfinite=False是否绘制非有限值(例如 NaN 和 inf)
data=None可选参数,用于构造默认数据
x=df3['时长'][::100]
y=df3['评分'][::100]

plt.figure(figsize=(10,6))
plt.scatter(x,y,color='c',marker='p')

plt.title('电影时长与评分散点图',fontsize=20)
plt.xlabel('时长',fontsize=18)
plt.ylabel('评分',fontsize=18)

plt.show()

绘制箱形图(盒须图、盒式图、箱线图)

plt.boxplot()

参数说明
x指定要绘制箱线图的数据
notch是否是凹口的形式展现箱线图,默认非凹口
sym指定异常点的形状,默认为+号显示
vert是否需要将箱线图垂直摆放,默认垂直摆放
whis指定上下须与上下四分位的距离,默认为1.5倍四分位差
positions指定箱线图的位置,默认为[0,1,2]
widths指定箱线图的宽度,默认为0.5
patch_artist是否填充箱体的颜色
meanline是否用线的形式表示均值,默认用点来表示
showmeans是否显示均值,默认不显示
showcaps是否显示箱线图顶端和末端的两条线,默认显示
showbox是否显示箱线图的箱体,默认显示
showfliers是否显示异常值,默认显示
boxprops设置箱体的属性,如边框色,填充色等
labels为箱线图添加标签,类似于图例的作用
flierprops设置异常值的属性,如异常点的形状、大小、填充色等
medianprops设置中位数的属性,如线的类型、粗细等
meanprops设置均值的属性,如点的大小、颜色等
capprops设置箱线图顶端和末端线条的属性,如颜色、粗细等
whiskerprops设置须的属性,如颜色、粗细、线的类型等

一般计算过程
(1)计算上四分位数(Q3),中位数,下四分位数(Q1)
(2)计算上四分位数和下四分位数之间的差值,即四分位数差(IQR,interquartile range)Q3-Q1
(3)绘制箱线图的上下范围,上限为上四分位数,下限为下四分位数。在箱子内部中位数的位置绘制横线
(4)大于上四分位数1.5倍四分位数差的值,或者小于下四分位数1.5倍四分位数差的值,划为异常值(outliers)
(5)异常值之外,最靠近上边缘和下边缘的两个值处,画横线,作为箱线图的触须
(6)极端异常值,即超出四分位数差3倍距离的异常值,用实心点表示;较为温和的异常值,即处于1.5倍-3倍四分位数差之间的异常值,用空心点表示
(7)为箱线图添加名称,数轴等

data = df3[df3.产地=='美国']['评分']

plt.figure(figsize=(10,6))
plt.boxplot(data,whis=2,flierprops={'marker':'o','markerfacecolor':'r','color':'k'},
           patch_artist=True,boxprops={'color':'k','facecolor':'#9999ff'})
plt.title("美国电影评分",fontsize=20)

plt.show()

  • 多组数据箱线图
datal=df3[df3.产地=='中国大陆']['评分']
data2=df3[df3.产地=='日本']['评分']
data3=df3[df3.产地=='中国香港']['评分']
data4=df3[df3.产地=='英国']['评分']
data5=df3[df3.产地=='法国']['评分']

plt.figure(figsize=(12,8))
plt.boxplot([datal,data2,data3,data4,data5],labels=['中国大陆','日木','中国香港','英国','法国'],whis=2,
            flierprops={'marker':'o','markerfacecolor':'r','color':'k'},
            patch_artist=True,boxprops={'color':'k','facecolor':'#9999ff'},vert=False)
plt.title('电影评分箱线图',fontsize=20)
plt.show()

相关系数矩阵图–热力图

data=df3[['投票人数','评分','时长']]
data[:5]
投票人数评分时长
0692795.09.6142.0
142995.09.5116.0
2327855.09.5116.0
3580897.09.4142.0
4478523.09.4171.0

pandas本身也封装了画图函数

我们可以画出各个属性之间的散点图,对角线是分布图

#用%pylab inline魔术命令使pandas的图象显示在jupyter notebook中

#result=pd.scatter_matrix(data[::100],diagonal='kde',alpha=0.3,figsize=(10,10))已弃用
result=pd.plotting.scatter_matrix(data[::100],diagonal='kde',alpha=0.3,figsize=(10,10))

我们可以画出各个属性之间的散点图,对角线是直方图

result=pd.plotting.scatter_matrix(data[::100],diagonal='hist',alpha=0.3,figsize=(10,10))

现在我们来画电影时长,投票人数,评分的一个相关系数矩阵图

seaborn是一个精简的oython库,可以创建具有统计意义的图表,能理解pandas的DataFrame类型

参数详解

seaborn.heatmap(data,vmin=None,vmax=None,cmap=None,center=None,robust=False,annot=None,fmt=‘.2g’,annot_kws=None,linewidths=0,linecolor=‘white’,cbar=True,cbar_kws=None,cbar_ax=None,square=False,xticklabels=‘auto’,yticklabels=‘auto’,mask=None,ax=None,"kwargs)

(1)热力图输入数据参数:
data:矩阵数据集,可以是numpy的数组(array),也可以是pandas的DataFrame.。如果是DataFrame,则df的lifidex/column信息会分别对应到heatmap的columns和rows,即pt.index是热力图的行标,pt.columns:是热力图的列标

(2)热力图矩阵块颜色参数:
vmax,vmin:分别是热力图的颜色取值最大和最小范围,默认是根据data数据表里的取值确定cmap:从数字到色彩空间的映射,取值是matplotlib包里的colormap名
称或颜色对象,或者表示颜色的列表:改参数默认值:根据center参数设定center:数据表取值有差异时,设置热力图的色彩中心对齐值;通过设置centerf值,可以
调整生成的图像颜色的整体深浅:设置center数据时,如果有数据溢出,则手动设置的vmax、vmin会自动改变robust:默认取值False;如果是False,且没设定vmin和vmax的值

(3)热力图矩阵块注释参数:
annot(annotate的缩写):默认取值False:如果是True,在热力图每个方格写入数据;如果是矩阵,在热力图每个方格写入该矩阵对应位置数据fmt:字符串格式代
码,矩阵上标识数字的数据格式,比如保留小数点后几位数字annot_kws:默认取值False;如果是True,设置热力图矩阵上数字的大小颜色字体,matplotlib包text类下的字体设置:

(4)热力图矩阵块之间间隔及间隔线参数:
linewidths:定义热力图里表示两两特征关系的矩阵小块"之间的间隔大小linecolor:切分热力图上每个矩阵小块的线的颜色,默认值是white’

(5)热力图颜色刻度条参数:
cbar:是否在热力图侧边绘制颜色刻度条,默认值是True cbar_kws:热力图侧边绘制颜色刻度条时,相关字体设置,默认值是None cbar_ax:热力图侧边绘制颜色刻度条时,刻度条位置设置,默认值是None

(6)square:设置热力图矩阵小块形状,默认值是False
xticklabels,yticklabels:xticklabels控制每列标签名的输出:yticklabels控制每行标签名的输出。默认值是auto。如果是True,则以DataFrame的列名作为标签名。如果是Fs,则不添加行标签名。如果是列表,则标签名改为列表中给的内容。如果是整数K,则在图上每隔K个标签进行一次标注。

import seaborn as sns

corr=data.corr()
corr=abs(corr)

fig=plt.figure(figsize=(10,8))
#ax=fig.add_subplot(figsize=(10,8))
ax=plt.subplots(figsize=(10,8))

ax=sns.heatmap(corr,vmax=1,vmin=0,annot=True,annot_kws={'size':13,'weight':'bold'},linewidths=0.05)

plt.xticks(fontsize=15)
plt.yticks(fontsize=15)

plt.show()
<Figure size 1000x800 with 0 Axes>

Scipy

Scipy是依赖于Numpy的科学计算库

SciPy模块功能表

模块功能
scipy.cluster聚类分析等
scipy.constants物理和数学常数
scipy.fftpack傅里叶变换
scipy.integrate积分
scipy.interpolate插值
scipy.io数据输入和输出
scipy.linalg线性代数
scipy.ndimagen维图像
scipy.odr正交距离回归
scipy.optimize优化
scipy.signal信号处理
scipy.sparse稀疏矩阵
scipy.spatial空间数据结构和算法
scipy.special特殊函数
scipy.stats统计
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值