前言
这个笔记系列主要是记录一些常用的函数,以及对一些函数的理解,对于软件的详细使用还是推荐去看一些视频教程,B站和油管上都有。
列表简单来说就是一串数据或者多串数据,也就是数组。Mathematica中的列表中的元素可以为任何类型,不同类型的元素也可以组成一个列表,拥有很大的自由性,而这也是Mathematica语言的一大特点。
在Mathematica中,有一个很特色的地方,在一些情况下,那就是我们可以不必区分表达式和列表,甚至在一些情况,可以将他们看成一种东西。这体现在很多函数中,通过看一些函数所要求的参数,可以发现参数里有列表的函数,往往都可以把表达式也作为参数。这也是Mathematica一个特色,理解了之后,可以很大的提高我们的效率。
对列表的函数一般都可以用于表达式,这些函数可以对任意头部起作用,而不仅仅是List,在mathematica中,表达式也可以看作是一个列表。对一个表达式进行TreeForm,可以看出表达式的结构,从结构中可以将表达式看成多维列表。例如:

最上面是头部,对于列表来说,头部为List。因此,可以将这个表达式当成{1, x, {x, {a, b}}},对其进行列表操作后再转化为表达式。例如对上述表达式,如果在{3,2}这个位置插入元素z,则列表变为{1, x, {x, {z,{a, b}}}},注意对表达式插入时,同时会插入相应的头,如下图,插入z时,会插入Power的头。

定义列表
直接定义
使用 {},列表元素的类型可以为各种类型。
a = {1, "rain", x^2}
根据表达式定义列表
Table[expr, {i, imin, imax, d}]
Table[x^2 + x, {x, 1, 10, 2}]
根据函数定义列表
Array。函数可以为之前定义的函数,比如f[x],也可以为匿名函数,比如 1+#^2&

从列表中提取元素
提取单个元素
提取首个元素
First[list]
提取末尾元素
Last[list]
提取指定位置的元素
使用两个"[[]]",序号可以为正,也可以为负
list[[index]]
提取多个元素
提取多个不连续的元素
将序号使用{}引起来
list[[{index1, index2, index3}]]
提取多个连续的
Take[list, {begin, end}]
如果后面只有一个数字,如果为正,则表示从头取n个元素,为负,表示从末尾取n个元素。例如Take[list, 10]表示取list的前10个元素
按照一定规则取列表元素
Select[list, crit, n]
选取list中使得crit[ei]为True的前n个元素,n可以不写,表示所有满足条件的元素。
crit一般为匿名函数,使用#来表示列表中的元素,根据#写条件,就可以得到满足条件的元素列表了。匿名函数最后要以&结束。例如:
list = Table[x, {x, 1, 10}]
Select[list, # > 5 &]
; 输出为列表中大于5的元素
{6, 7, 8, 9, 10}
列表属性
列表长度
Length[list]
列表维度
Dimensions[list]
列表操作
列表合并
直接合并(连接多个列表)
Join[list1, list2, ..., n]
最后的n可以不写,写n表示合并每个列表的第n个元素
并集
即合并后将重复值删掉,每个值只保留一份,并会对列表元素进行排序。因此,如果Union里只有一个列表,会对列表进行删除重复值和排序的操作。
Union[list1, list2, ...]
交集
Intersection
补集
Complement[universal,list1,…] 给出在 universal 中,但不在 listi 中的元素的列表
列表的增删改查
以下所有函数用法都差不多,第一项为列表,如果涉及到元素,则第二项为增加的元素或者查找的元素,多个元素则使用列表表示,最后一项为位置,多个位置也是用列表表示。
增加元素
Append[list, element]
AppendTo[list, element] 与append不同的是appendto会将增加元素后的列表赋值进list中
Insert:

PadLeft, PadRight 填充列表
PadLeft[list,len,x] 在 list 的左边用 x 进行填充,产生一个长度为 len 的列表
PadRight[list,len,x] 在 list 的右边进行填充
最后一个应用可以在表达式对应的位置插入元素,pos对应的是深度信息,示例:
in:
Insert[f[a, b, c, d], x, 2]
out:
f[a,x,b,c,d]
in:
1 + x^(a + b) + y^(c + d);
Insert[%, zzz, {3, 2, 3}]
out:
1 + x^(a + b) + y^(c + d + zzz)
删除元素
Delete(删除指定位置的元素)

Drop(删除连续的多个元素)

Rest[list] 去掉 list 的第一个元素
Most[list] 去掉 list 的最后一个元素
修改元素
可以直接对原列表修改,例如
a = {1, 2, 3}
a[[1]] = 4
输出:
{4, 2, 3}
也可以使用函数进行批量修改,为ReplacePart

查找元素
pattern为设置的模式,可以按照模式进行查找
模式匹配是指将FullForm格式相同的元素提取出来,结构相同。关于模式的官方文档:pattern

MemberQ[list, form] 检测form是否为list的元素
FreeQ[list, form] 检测form是否不在list中
重排列表
Sort:

排序函数可以是纯函数,也可以是内置的函数。例如:
Sort[{{a, 2}, {c, 1}, {d, 3}}, #1[[2]] < #2[[2]] &]
SortBy:按函数值排列
Reverse:

RotateLeft[list, n] 把列表 list 元素向左轮换 n 个位置
RotateRight[list, n] 把列表 list 元素向右轮换 n 个位置
Ordering: 返回结果是位置

列表分组

第二个应用很有意思,比如

Gather:与split的不同之处在于Gather没有顺序的要求,而split有顺序的要求,例如对于{1, 1, 2, 2, 1, 2},split后的结果为{{1, 1}, {2, 2}, {1}, {2}},而Gather后的结果为{{1, 1, 1}, {2, 2, 2}}

SplitBy[list,f] 将 list 的参数收集到相同参数的子列表中
GatherBy[list,f] 当应用 f 时,将列表的参数收集到具有相同值的子列表中
加了by就相当于对一个列表经过函数运算后的列表在进行分组或收集
Partition:常用的是前两个

其他操作
统计每个元素的个数(重复值)

Tally[{a, a, b, b, a, c, a}]
out:
{{a, 4}, {b, 2}, {c, 1}}
删除重复值
前面提到过,Union也可以删除重复值,但是会对其重新排序。而DeleteDuplicates不会对其排序

DeleteDuplicatesBy 删除具有相同函数值的元素
DeleteAdjacentDuplicates 用法与DeleteDuplicates相同,但是作用是删除相邻重复值的元素
列表的运算(向量)
在mathematica中,向量也是一个列表
v1 = {1, 2};
v2 = {2, 3};
v1 + v2; (*求和*)
v1 . v2; (*点乘*)
2 v1; (*列表与常数的乘法*)
VectorAngle[v1, v2] (*求两个向量夹角*)
Cross[v1, v2] (*叉乘*)
Inner
考虑两个列表A和B,点积是将两个列表对应的元素相乘后再进行相加运算,其中涉及到了两个列表对应元素的运算,即A[[i]]*B[[i]],又涉及到了将得到的结果再进行运算的过程。考虑将这个过程更加一般化,即第一个运算不再是Times,第二个不再是Plus,而是各种函数,这就是Inner。
Inner[f,list1,list2,g]
Inner的语法如上,对于点积来说,f为Times,g为Plus。它表示将list1和list2对应位置的元素进行f运算,然后将得到的一个序列进行g运算。例如
Inner[Divide, {a, b}, {x, y}, Plus]
out:a/x + b/y
在上例中,首先是进行Divide,得到了a/x, b/y,然后进行Plus,即Plus[a/x, b/y],得到最后的结果。
Outer
Outer是广义外积,相比于Inner的一对一,Outer是一对多。A中的每一个元素都要与B的所有元素进行运算,最后得到一个矩阵。比如:
Outer[f, {a, b}, {x, y, z}]
out:{{f[a, x], f[a, y], f[a, z]}, {f[b, x], f[b, y], f[b, z]}}
其语法为:

对于中间的list,其头部不一定是list,例如:
Outer[g, f[a, b], f[x, y, z]]
out:f[f[g[a, x], g[a, y], g[a, z]], f[g[b, x], g[b, y], g[b, z]]]
矩阵
矩阵就是列表的嵌套,所以对矩阵操作也是对列表操作。
矩阵函数 | 含义 |
---|---|
MatrixForm[s] | 以标准的二维矩阵形式显示s |
DiagonalMatrix[{a, b, c}] | 生成一个3x3的对角阵,对角元素为a,b,c |
Inverse[m] | 矩阵的逆 |
MatrixPower[m,n] | 矩阵的n次幂 |
Det[m] | 矩阵的行列式 |
Tr[m] | 矩阵的迹 |
Transpose[m] | 矩阵的转置 |
Eigenvalues[m] | 矩阵的特征值 |
Eigenvectors[m] | 矩阵的特征向量 |
函数作用于列表
Map (/@) — 将函数映射于一个列表: f/@{a,b,c}⟶{f[a],f[b],f[c]}
Apply (@@) — 将函数作用于一个列表: f@@{x,y,z}⟶f[x,y,z]
MapApply (@@@) — 将函数作用于一个列表: f@@@{x,y,z}⟶{f@@x,f@@y,f@@z}
列表中的数学运算
函数 | 功能 |
---|---|
Total[list, n] | 求和(n表示深度,可以省略) |
Accumulate[list] | 逐次求和 |
Differences[list, n] | list的第n阶差分(n可以省略) |
Count[list, pattern] | 统计匹配模式的元素数量 |
CountDistinct[list] | 统计不同元素的数目 |
CountDistinctBy | |
Max/Min[list1, list2, ...] | 所有列表中的最大值/最小值 |
MaxMin[list1, list2, ...] | 返回{min, max} |
TakeLargest[list,n] | 返回前n个最大的 |
TakeLargestBy[list,f,n] | |
TakeSmallest | |
TakeSmallestBy |