自动删除Mathematica表中的特定元素

时间:2011-09-02 19:54:42

标签: list wolfram-mathematica nested-lists

我有一个问题,可以分为两个子问题。 我创建了一个表,其代码如下所示。

问题1。

xstep = 1;
xmaximum = 6;
numberofxnodes = 6;
numberofynodes = 3;
numberofzlayers = 3;
maximumgridnodes = numberofxnodes*numberofynodes
mnodes = numberofxnodes*numberofynodes*numberofzlayers;
orginaltable = 
   Table[{i, 
          node2 = i + xstep, node3 = node2 + xmaximum,
          node4 = node3 - xstep,node5 = i + maximumgridnodes,
          node6 = node5 + xstep,node7 = node6 + xmaximum,
          node8 = node7 - xstep}, 
        {i, 1, mnodes}]

如果我跑这个,我会得到我原来的桌子。基本上我想从原始表中删除第六个元素和第六个元素的倍数。我可以使用下面的代码来完成此操作。

 modifiedtable = Drop[orginaltable, {6, mnodes, 6}]

现在我得到修改后的表,其中删除了我原始表的第六个元素和第六个元素的倍数。这解决了我的问题1.

现在我的问题2:

**主要编辑版** :(以上所有代码都是正确的)

非常感谢你的答案,但我想要别的东西,我犯了一个错误 虽然最初解释它,所以我再试一次。

下面是我修改过的表:我想要介于两者之间的元素  “/ **和** /”已删除并留在那里。

  

{{1,2,8,7,19,20,26,25},{2,3,9,8,20,21,27,26},{3,4,10,9,21 ,22,28,27},{4,5,11,10,22,23,29,28},{5,6,12,11,23,24,30,29},{7,8,14 ,13,25,26,32,31},{8,9,15,14,26,27,33,32},{9,10,16,15,27,28,34,33},{10 ,11,17,16,28,29,35,34},{11,12,18,17,29,30,36,35},/ ** {13,14,20,19,31,32, 38,37},{14,15,21,20,32,33,39,38},{15,16,22,21,33,34,40,39},{16,17,23,22, 34,35,41,40},{17,18,24,23,35,36,42,41},** / {19,20,26,25,37,38,44,43},{20 ,21,27,26,38,39,45,44},{21,22,28,27,39,40,46,45},{22,23,29,28,40,41,47,46 },{{23,24,30,29,41,42,48,47},{25,26,32,31,43,44,50,49},{26,27,33,32,44,45 ,51,50},{27,28,34,33,45,46,52,51},{28,29,35,34,46,47,53,52},{29,30,36,35 ,47,48,54,53},/ ** {31,32,38,37,49,50,56,55},{32,33,39,38,50,51,57,56},{ 33,34,40,39,51,52,58,57},{34,35,41,40,52,53,59,58},{35,36,42,41,53,54 ,60,59},** / {37,38,44,45,55,56,62,61},{38,39,45,44,56,57,63,62},{39,40, 46,45,57,58,64,63},{40,41,47,46,58,59,65,64},{41,42,48,47,59,60,66,65},{ 43,44,50,49,61,62,68,67},{44,45,51,50,62,63,69,68},{45,46,52,51,63,64,70, 69},{46,47,53,52,64,65,71,70},{47,48,54,53,65,66,72,71},/ ** {49,50,56,55 ,67,68,74,73},{50,51,57,56,68,69,75,74},{51,52,58,57,69,70,76,75},{52,53 ,59,58,70,71,77,76},{53,54,60,59,71,72,78,77}} ** /

现在,如果你观察,我想要前十个元素  (modifiedtable的第1到第10个元素)在我的决赛桌中  (DoubleModifiedTable)。删除了接下来的五个(modifiedtable的第11个到第15个元素)。 接下来的十个元素(modifiedtable的第16到第25个元素) 出现在我的决赛桌(DoubleModifiedTable) 接下来的五个被删除(modifiedtable的第26到第30个元素),等等整个表格。

假设我们解决了这个问题,并将最终表格命名为DoubleModifiedTable

我基本上对获得DoubleModifiedTable感兴趣。我决定将问题细分为易于解释。

我希望这通过表自动发生,因为这只是一个示例表,但实际上我有很大的表。如果我能理解如何为这个表解决这个问题,那么我也可以为我的大表解决它。

3 个答案:

答案 0 :(得分:4)

也许更简单:

DoubleModifiedTable = 
  Module[{copy  = modifiedtable},
  copy[[Flatten[# + Range[5] & /@ Range[10, Length[copy], 10]]]] = Sequence[];
  copy]

修改

更简单:

DoubleModifiedTable =
   Delete[modifiedtable,
     Transpose[{Flatten[# + Range[5] & /@ Range[10, Length[modifiedtable], 10]]}]]

编辑2

每个OP的请求:我只需要在我的任何解决方案中更改单个数字(10到15),以获得修改后问题的答案:

DoubleModifiedTable =
  Delete[modifiedtable,
    Transpose[{Flatten[# + Range[5] & /@ Range[10, Length[modifiedtable], 15]]}]]

答案 1 :(得分:3)

另一种方法是做一些像

这样的事情
DoubleModifiedTable = With[{n = 10, m = 5},
  Flatten[{{modifiedtable[[;; m]]}, 
    Partition[modifiedtable, n - m, n, {n - m + 1, 1}, {}]}, 2]]

修改

问题2的编辑版本实际上比原始版本稍微简单一些。例如,您可以执行类似

的操作
DoubleModifiedTable = 
 With[{n = 10, m = 5}, Flatten[Partition[modifiedtable, n, n + m, 1, {}], 1]] 

修改2

我的第二个版本的作用是使用modifiedtable将原始列表Partition拆分为子列表,然后展平这些子列表以形成最终列表。如果您查看Documentation for Partition,您可以看到我使用的是Partition的第6种形式,这意味着子列表的长度为n,偏移量(距离为{ {1}}。因此,子列表之间的差距为n+m

下一个参数n+m-n==m实际上等同于1,它告诉Mathematica {1,1}的第一个元素应该出现在第一个子列表中的第一个位置和{的最后一个元素{1}}应出现在最后一个子列表的第1位或之后。

最后一个参数modifiedtable表示不应将填充用于长度为modifiedtable的子列表。

总之,如果您要删除前10个元素并保留接下来的5个元素,则需要长度为{}且间距为<=n的子列表。由于您希望第一个子列表以n=5的{​​{1}}元素开头,因此可以将m=10中的第四个参数替换为(m+1)形式的某个值modifiedtable的{​​{1}},但事先删除Partition的第一个{k,1}元素可能更容易,即

k

答案 2 :(得分:1)

DoubleModifiedTable=
modifiedtable[[
  Complement[
   Range[Length[modifiedtable]],
   Flatten@Table[10 i + j, {i, Floor[Length[modifiedtable]/10]}, {j, 5}]
  ]
]]

或略短

DoubleModifiedTable=
#[[
    Complement[
       Range[Length[#]],
       Flatten@Table[10 i + j, {i, Floor[Length[#]/10]}, {j, 5}]
     ]
 ]] & @ modifiedtable