【问题标题】:Mathematica: How to apply function to a certain column of a tableMathematica:如何将函数应用于表格的某一列
【发布时间】:2010-12-31 14:41:48
【问题描述】:

我想将函数应用于表格的特定列。对 (m x n) 表的第 i 列说。实际上我只是想将该列中的所有元素与一个标量相乘,但是应用一个通用函数也可以。

它可能只需要一些 Map 或 MapAt 命令,可能与 Transpose 结合使用以应用于行而不是列 - 但我无法找出解决整个列(或行)的正确语法..

任何提示将不胜感激。

【问题讨论】:

标签: wolfram-mathematica


【解决方案1】:

这是一个 3x3 的表格:

In[1]:= table = {{1,2,3}, {4,5,6}, {7,8,9}}
Out[1]= {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
In[2]:= table//TableForm
Out[2]//TableForm= 1   2   3
                   4   5   6
                   7   8   9
第 2 列是table[[All, 2]]

In[3]:= table[[All, 2]]
Out[3]= {2, 5, 8}

所以只修改该列是一件简单的事情:

In[4]:= table[[All, 2]] = 10 * table[[All, 2]]
Out[4]= {20, 50, 80}
In[5]:= table//TableForm
Out[5]//TableForm= 1   20   3
                   4   50   6
                   7   80   9

【讨论】:

  • 另一种优雅的方法就像 C 中的累积函数:table[[All, 2]] *= 10
【解决方案2】:

例如,

ranfunc=Function[{f,mat, n},Transpose[MapAt[f /@ # &, Transpose[mat], n]]]

将 f 应用于 mat 的第 n 列的每个元素。所以,例如,

ranfunc[Sin[Cos[#]] &, {{1, 2, 3}, {a, b, c}, {\[Alpha], \[Beta], \[Gamma]}}, 2]

将 Sin[Cos[#]]& 应用于第二列的每个元素,而

ranfunc[s*# &, {{1, 2, 3}, {a, b, c}, {\[Alpha], \[Beta], \[Gamma]}},2]

将第二列的每个元素乘以 s

【讨论】:

  • 是的,这行得通。谢谢!在我自己的尝试中,我错过了 MapAt 内的嵌套地图( /@ )。顺便说一句:如果只是在乘以 3 的第 2 列之后,矩阵乘法 A.DiagonalMatrix[{1,s,1}] 也可以解决问题。但是您的解决方案更加优雅和灵活。
【解决方案3】:

一种通用的方法是使用 ReplacePart

例如,将 f 应用于 mat 的第 3 列:

(mat = Array[Subscript[a, ##] &, {4, 4}]) // MatrixForm

(newmat = ReplacePart[#, 3 -> f  @#[[3]] ] & /@ mat) // MatrixForm

以下将每个条目乘以 10:

(newmat2 = ReplacePart[#, 3 -> 10 #[[3]] ] & /@ mat) // MatrixForm

但是,一种“快速”的方法如下:

mat[[All, 3 ]] *= 10

(与第一种方法不同,现在mat的第3列中的所有条目都被修改了。不清楚是要修改现有表,还是要创建一个修改后的新表,保持原样)

【讨论】:

  • +1,我绝对喜欢在 MapAt 实现上使用 ReplacePart,因为这需要使用 Transpose 才能有效。
【解决方案4】:

MapAt 函数接受以下 Part 规范:

MapAt[f, mat, {All, 3}]

将“f”应用于矩阵的第 3 列。

【讨论】:

    【解决方案5】:

    我发现的另一个紧凑的解决方案是使用 Map 和 MapAt:

    这是一个示例矩阵:

    mat={{3,4,5},{4,7,5},{2,6,7},{3,6,9}}
    

    现在将函数 f 应用到第二列:

    n=2;
    Map[MapAt[f,#,n]&,mat]
    

    那么结果是:

    {{3,f[4],5},{4,f[7],5},{2,f[6],7},{3,f[6],9}}
    

    【讨论】:

    • 优雅、易读且可与内嵌代码一起使用,例如,在绘制列表之前操作列表时,例如将 x 列乘以 2:ListPlot[Map[MapAt[Function[x, 2 x], #, 1] &, 列表]]
    • 感谢你我发现了MapAt!但是,Map 包装器甚至不需要,您可以直接编写 MapAt[f,mat,{All,2}]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2021-07-28
    • 2013-07-25
    • 2013-01-27
    相关资源
    最近更新 更多