操作列表
操作列表
| Range[n] | 列表 {1,2,3,…,n} |
| Table[expr,{i,n}] | i 从 1 到 n 的 expr 的值 |
| Array[f,n] | 列表 {f[1],f[2],…,f[n]} |
| NestList[f,x,n] | 具有 n 个嵌套的{x,f[x],f[f[x]],…} |
| Normal[SparseArray[{i1->v1,…},n]] | 长度为 n 的列表,元素 ik 为 vk |
| Apply[List,f[e1,e2,…]] | 列表 {e1,e2,…} |
Table[2 ^ i, {i, 5}]Array[2 ^ #&, 5]NestList[2#&, 1, 5]SparseArray 帮助用户在特定位置指定值:
Normal[SparseArray[{3 -> x, 4 -> y}, 5]]Normal[SparseArray[{i_ -> 2 ^ i}, 5]]| Table[expr,{i,list}] | 当 i 从 list 中取值时, expr 的值 |
| Map[f,list] | 对 list 的每个元素应用 f |
| MapIndexed[f,list] | 对于第 i 个元素,给出 f[elem,{i}] |
| Cases[list,form] | 给出与 form 匹配的 list 的元素 |
| Select[list,test] | 选出 test[elem] 为 True 的元素 |
| Pick[list,sel,form] | 选出 list 的元素,sel 相应的元素与 form 匹配 |
| TakeWhile[list,test] | |
| list[[{i1,i2,…}]] or Part[list,{i1,i2,…}] | |
给出 list 指定部分的列表 | |
Select[{1, 3, 7, 4, 10, 2}, # < 5&]TakeWhile[{1, 3, 7, 4, 10, 2}, # < 5&]{a, b, c, d}[[{2, 1, 4}]]Pick[{a, b, c, d}, {1, 0, 1, 1}, 1]Nest[# ^ 2&, 2, 6]Reap[Nest[(If[# > 1000, Sow[#]];# ^ 2)&, 2, 6]]| Part[list,spec] or list[[spec]] | 列表的一个或多个部分 |
| Part[list,spec1,spec2,…] or list[[spec1,spec2,…]] | 嵌套列表的一个或多个部分 |
| n | 开头的第 n 个部分 |
| -n | 末尾的第 n 个部分 |
| {i1,i2,…} | 由部分组成的列表 |
| m;;n | 第 m 部分到第 n 部分 |
| All | 所有部分 |
{a, b, c, d}[[{1, 3}]]m = {{a, b, c}, {d, e}, {f, g, h}};m[[{1, 3}]]m[[{1, 3}, 1]]m[[{1, 3}, {1, 2}]]m[[1 ;; 2]]m[[1 ;; 2, -1]]m[[All, 2]]m[[All, -2 ;; -1]]m[[1, 2]] = xmm[[{1, 3}]] = {x, y};mm[[{1, 3}]] = p;mm = {{a, b, c}, {d, e}, {f, g, h}};m[[{1, 3}, {1, 2}]] = x;m可以使用 ;; 来指定给定范围内所有索引:
m[[1 ;; 3, 2]] = y;m有时,把一个嵌套列表想象为在空间的展开是有益的,这时,每个元素都是在由其索引所提供的坐标位置上. 对于list[[spec1,spec2,…]],存在直接的几何解释. 如果一个给定的 speck 是一个单一的整数,那么表示在第 k 维提取单一的分块,而如果是一个列表的话,表示提取平行分块的列表. 那么 list[[spec1,spec2,…]] 的最终结果是在每个连续纬度上分块所得到的元素集合.
(m = {{a, b, c}, {d, e, f}, {g, h, i}})//TableFormm[[{1, 3}, {1, 2}]]//TableForm| Part[list,{i1,i2,…}] | 列表 {list[[i1]],list[[i2]],…} |
| Extract[list,{i1,i2,…}] | 元素 list[[i1,i2,…]] |
| Part[list,spec1,spec2,…] | 由连续分片指定的部分 |
| Extract[list,{{i1,i2,…},{j1,j2,…},…}] | 单一部分{list[[i1,i2,…]],list[[j1,j2,…]],…} 的列表 |
Extract[m, {{1, 3}, {1, 2}}]m = {{a[1], a[2], b[1]}, {b[2], c[1]}, {{b[3]}}};Position[m, b[_]]Extract[m, %]| Take[list,spec] | 选出列表的指定部分 |
| Drop[list,spec] | 丢弃列表的指定部分 |
| Take[list,spec1,spec2,…] , Drop[list,spec1,spec2,…] | 在嵌套列表的每一层选出或丢弃指定部分 |
| n | 前 n 个元素 |
| -n | 最后 n 个元素 |
| {n} | 仅含元素 n |
| {m,n} | 元素 m 到 n (闭区间) |
| {m,n,s} | 元素 m 到 n,步长为 s |
| All | 所有部分 |
| None | 没有部分 |
Take[{a, b, c, d, e, f, g}, {2, -1, 2}]Drop[{a, b, c, d, e, f, g}, {2, -1, 2}](m = {{a, b, c}, {d, e, f}, {g, h, i}})//TableFormTake[m, 2, 2]//TableFormTake[m, All, 2]//TableFormDrop[m, None, 2]//TableForm| Prepend[list,elem] | 在 list 的开头加入 element |
| Append[list,elem] | 在 list 的末尾加入 element |
| Insert[list,elem,i] | 在位置 i 插入 element |
| Insert[list,elem,{i,j,…}] | 在位置 {i,j,…} 插入 |
| Delete[list,i] | 在位置 i 删除元素 |
| Delete[list,{i,j,…}] | 在位置 {i,j,…} 删除 |
Insert[{{a, b, c}, {d, e}}, x, {2, 1}]Delete[%, {2, 1}]| ReplacePart[list,i->new] | 用 new 替换 list 中位置 i 上的元素 |
| ReplacePart[list,{i,j,…}->new] | 用 new 替换 list[[i,j,…]] |
| ReplacePart[list,{i1->new1,i2->new2,…}] | 用 newn 替换位置 in 上的部分 |
| ReplacePart[list,{{i1,j1,…}->new1,…}] | 用 newn 替换位置 {in,jn,…} 上的部分 |
| ReplacePart[list,{{i1,j1,…},…}->new] | 用 new 替换所有部分 list[[ik,jk,…]] |
ReplacePart[{a, b, c, d}, 3 -> x]ReplacePart[{a, b, c, d}, {{1}, {4}} -> x]IdentityMatrix[3]ReplacePart[%, {2, 2} -> x]alist = {a, b, c, d}ReplacePart[alist, 3 -> x]alist| {list1,list2,…} | 列表的列表 |
| Table[expr,{i,m},{j,n},…] | 由 expr 的值构成的 m×n×… 表格 |
| Array[f,{m,n,…}] | 由 f[i,j,…] 的值构成的 m×n×… 数组 |
| Normal[SparseArray[{{i1,j1,…}->v1,…},{m,n,…}]] | |
m×n×… 数组,元素 {is,js,…} 为 vs | |
| Outer[f,list1,list2,…] | 对与 f 结合的元素进行的一般外层求积操作 |
| Tuples[list,{m,n,…}] | 由 list 得到的元素组成的所有 m×n×… 数组 |
Table[x ^ i + j, {i, 2}, {j, 3}]Array[x ^ #1 + #2&, {2, 3}]Normal[SparseArray[{{1, 3} -> 3 + x}, {2, 3}]]Outer[f, {a, b}, {c, d}]| Dimensions[list] | 完全数组的维度 |
| ArrayQ[list] | 测试在给定层上的所有子列表是否具有相同长度 |
| ArrayDepth[list] | 所有子列表具有相同长度 |
Wolfram 语言可以处理任意嵌套列表. 列表没有必要形成一个完全数组. 使用 Table 可以很容易地形成不规则的数组.
Table[x ^ i + j, {i, 3}, {j, i}]| Flatten[list] | 压平 list 的所有层 |
| Flatten[list,n] | 压平前 n 层 |
| ArrayFlatten[list,rank] | 从由数组构成的数组构建压平的数组 |
Array[a, {2, 3}]Flatten 根据索引的字典顺序放置元素:
Flatten[%]ArrayFlatten[{{{{1}}, {{2, 3}}}, {{{4}, {7}}, {{5, 6}, {8, 9}}}}]Array[a, {2, 2, 2}]Transpose[%, {3, 1, 2}]Transpose[%, {2, 3, 1}]| Map[f,list,{n}] | 在第 n 层上对所有元素进行 f 映射 |
| Apply[f,list,{n}] | 对第 n 层上的所有元素应用 f |
| MapIndexed[f,list,{n}] | 在第 n 层上的部分元素以及索引上映射 f |
m = {{{a, b}, {c, d}}, {{e, f}, {g, h}, {i}}};Map[f, m, {2}]Apply[f, m, {2}]MapIndexed[f, m, {2}]| Partition[list,{n1,n2,…}] | 分成 n1×n1×… 的块 |
| PadLeft[list,{n1,n2,…}] | 在左边填充以生成一个 n1×n1×… 数组 |
| PadRight[list,{n1,n2,…}] | 在右边填充以生成一个 n1×n1×… 数组 |
| RotateLeft[list,{n1,n2,…}] | 在第 k 层向左轮换 nk 个位置 |
| RotateRight[list,{n1,n2,…}] | 在第 k 层向右轮换 nk 个位置 |
m = {{{a, b, c}, {d, e}}, {{f, g}, {h}, {i}}};RotateLeft[m, {0, 1, -1}]PadRight[%, {2, 3, 3}]| Partition[list,n] | 把 list 分为长度为 n 的子列表 |
| Partition[list,n,d] | 使用偏移量 d 划分子列表 |
| Split[list] | 把 list 分成相同元素的子列表 |
| Split[list,test] | 分成相邻元素满足 test 的子列表 |
Partition[{a, b, c, d, e, f}, 3]Partition[{a, b, c, d, e, f}, 3, 1]Partition[{a, b, c, d, e, f}, 2, 3]Split[{1, 4, 1, 1, 1, 2, 2, 3, 3}]Split[{1, 4, 1, 1, 1, 2, 2, 3, 3}, Unequal]Partition 遍历一个列表,并把相邻的元素分成子列表. 默认情况下,没有包含任何令原列表悬空的子列表.
Partition[{a, b, c, d, e}, 2]Partition[{a, b, c, d, e}, 3, 1]用户可以告诉 Partition 包含令原列表末尾悬空的子列表. 默认情况下,通过周期性地处理原来的列表,可以填入其他额外的元素. 也可以根据用户指定的元素进行填充.
Partition[{a, b, c, d, e}, 3, 1, {1, 1}]Partition[{a, b, c, d, e}, 3, 1, {1, 1}, x]Partition[{a, b, c, d, e}, 3, 1, {1, 1}, {x, y}]Partition[{a, b, c, d, e}, 3, 1, {1, 1}, {}]Partition[{a, b, c, d}, 3, 1, {-1, 1}, x]Partition[{a, b, c, d}, 3, 1, {-1, -1}, x]| Partition[list,n,d] or Partition[list,n,d,{1,-1}] | 只保留没有悬空的子列表 |
| Partition[list,n,d,{1,1}] | 允许在末尾有悬空 |
| Partition[list,n,d,{-1,-1}] | 允许在开头有悬空 |
| Partition[list,n,d,{-1,1}] | 允许在开头和末尾都有悬空 |
| Partition[list,n,d,{kL,kR}] | 指定第一个和最后一个子列表的对齐 |
| Partition[list,n,d,spec] | 通过在 list 中周期性地重复元素进行填充 |
| Partition[list,n,d,spec,x] | 通过重复元素 x 填充 |
| Partition[list,n,d,spec,{x1,x2,…}] | |
通过周期性地重复 xi 填充 | |
| Partition[list,n,d,spec,{}] | 不使用填充 |
Partition[{a, b, c, d}, 3, 1, {1, 1}, x]Partition[{a, b, c, d}, 3, 1, {2, 1}, x]Partition[{a, b, c, d}, 3, 1, {4, 1}, x]Partition[{a, b, c, d}, 3, 1, {4, 1}, {x, y}]| PadLeft[list,n] | 通过在左边插入零进行填充,以达到长度 n |
| PadLeft[list,n,x] | 通过重复元素 x 进行填充 |
| PadLeft[list,n,{x1,x2,…}] | 通过周期性地重复 xi 进行填充 |
| PadLeft[list,n,list] | 通过周期性地重复 list 进行填充 |
| PadLeft[list,n,padding,m] | 在右边留出 m 个元素大小的空白 |
| PadRight[list,n] | 在右边插入零进行填充 |
PadLeft[{a, b, c}, 6]PadLeft[{a, b, c}, 6, {x, y}]PadLeft[{a, b, c}, 10, {x, y}, 3]PadLeft[{{a, b}, {e}, {f}}, {3, 3}, x]Partition[%, {2, 2}, {1, 1}]PadLeft[{{a, b}, {e}, {f}}, {4, 4}, {{x, y}, {z, w}}]PadLeft[{{}}, {4, 4}, {{x, y}, {z, w}}]在 Wolfram 语言中,列表通过给出元素的明确集合来指定. 但是当处理大型数组时,能够指明特定位置处的元素值,并将其余元素指定为默认值,常常是有用的. 在 Wolfram 语言中可以使用 SparseArray 对象实现.
| {e1,e2,…} , {{e11,e12,…},…}, … | 普通列表 |
| SparseArray[{pos1->val1,pos2->val2,…}] | |
稀疏数组 | |
SparseArray[{2 -> a, 5 -> b}]Normal[%]SparseArray[{{1, 2} -> a, {3, 2} -> b, {3, 3} -> c}]Normal[%]| SparseArray[list] | list 的稀疏数组版本 |
| SparseArray[{pos1->val1,pos2->val2,…}] | |
在位置 posi 上值为 vali 的稀疏数组 | |
| SparseArray[{pos1,pos2,…}->{val1,val2,…}] | |
同样的稀疏数组 | |
| SparseArray[Band[{i,j}]->val] | 值为 val 的带状稀疏矩阵 |
| SparseArray[data,{d1,d2,…}] | d1×d2×… 稀疏数组 |
| SparseArray[data,dims,val] | 默认值为 val 的稀疏数组 |
| Normal[array] | array 的普通列表版本 |
| ArrayRules[array] | array 的位置值规则 |
SparseArray[{a, b, c, d}]Normal[%]SparseArray[{3 -> a, 5 -> b}, 7, x]Normal[%]ArrayRules[%%]SparseArray[{Band[{1, 1}] -> x, Band[{2, 1}] -> y}, {5, 5}]//MatrixFormSparseArray 的重要特征是用户指定的位置可以是模式.
SparseArray[{i_, i_} -> 1, {4, 4}]Normal[%]Normal[SparseArray[{{1, 3} -> a, {i_, i_} -> 1}, {4, 4}]]Normal[SparseArray[{{_, 3} -> a, {i_, i_} -> 1}, {4, 4}]]Normal[SparseArray[{{i_, i_}: > RandomReal[]}, {3, 3}]]Normal[SparseArray[i_ -> i ^ 2, 10]]Normal[SparseArray[{_ ? EvenQ -> p, i_ -> i ^ 2}, 10]]Normal[SparseArray[{1 | 3, 2 | 4} -> a, {4, 4}]]Normal[SparseArray[i_ /; 3 < i < 7 -> p, 10]]Normal[SparseArray[{{i_, j_} /; Abs[i - j] < 2 -> i + j}, {5, 5}]]Normal[SparseArray[{Band[{1, 1}] -> {2, 4, 6, 8, 10}, Band[{1, 2}] -> {3, 5, 7, 9}, Band[{2, 1}] -> {3, 5, 7, 9}}, {5, 5}]]为了许多不同的目的,Wolfram 系统用类似其所对应的普通列表的处理方式处理 SparseArray 对象. 因此,例如,如果用户要求一个稀疏数组对象的部分元素,Wolfram 系统将用类似在对应的普通列表中获取部分元素的方式进行.
s = SparseArray[{2 -> a, 4 -> b, 5 -> c}, 10]Normal[s]s[[2]]s[[3]]许多操作用类似普通列表的方式处理 SparseArray 对象. 在可能的情况下,他们给出稀疏矩阵作为结果.
3 s + xNormal[%]Dot 直接对稀疏数组对象进行操作:
s.ss.Range[10]Wolfram 系统用具有头部 SparseArray 的表达式表示稀疏数组. 当计算一个稀疏数组的时候,就自动转换为具有结构 SparseArray[Automatic,dims,val,…] 的优化标准形式.
t = SparseArray[{1 -> a, 5 -> b}, 10]InputForm[%]Length 给出对应的普通列表的长度:
Length[t]Map 也对单个数值进行操作:
Normal[Map[f, t]]