Wolfram mathematica “数学”;附于「;函数问题
我是Mathematica的新手,在向数据表添加列时遇到了一个重大故障。我在Vista中运行Mathematica 7。我在这里询问之前花了很多时间进行RFD 我有一个三列五行的数据表(mydata)。我试图向表中添加两个包含五个元素的列表(有效地向数据表中添加两列) 这非常有效: 使用:Wolfram mathematica “数学”;附于「;函数问题,wolfram-mathematica,Wolfram Mathematica,我是Mathematica的新手,在向数据表添加列时遇到了一个重大故障。我在Vista中运行Mathematica 7。我在这里询问之前花了很多时间进行RFD 我有一个三列五行的数据表(mydata)。我试图向表中添加两个包含五个元素的列表(有效地向数据表中添加两列) 这非常有效: 使用:mydata//TableForm打印出表格将显示添加的列 但是,当我尝试添加第二个列表时 Table[AppendTo[mydata[[i]],mysecondlist[[i]]],{i,5}] 要么Mat
mydata//TableForm
打印出表格将显示添加的列
但是,当我尝试添加第二个列表时
Table[AppendTo[mydata[[i]],mysecondlist[[i]]],{i,5}]
要么Mathematica崩溃了(!),要么我得到了大量的Part::partw
和Part::spec
错误,说第5部分不存在
但是,在所有错误消息之后(如果Mathematica没有崩溃),再次打印数据表时使用:mydata//TableForm
显示的数据表有五列,与我预期的一样。修改后的数据表上的所有TableForm
格式选项都可以正常工作
谁能告诉我我做错了什么?提前谢谢 我试图重现这一点,但失败了。我在Windows XP上运行Mma 8;看起来差别并不重要,但谁知道呢?我说,接二连三,
myData = {{1, 2, 3}, {2, 3, 4}, {8, 9, 10}, {1, 1, 1}, {2, 2, 2}}
myFirstList = {9, 9, 9, 9, 9}
mySecondList = {6, 6, 6, 6, 6}
Table[AppendTo[myData[[i]], myFirstList[[i]]], {i, 4}]
Table[AppendTo[myData[[i]], mySecondList[[i]]], {i, 5}]
myData // TableForm
并得到(0)没有崩溃,(1)没有错误或警告,(2)我期望的输出。(注意:我在第一组附录的限制中使用了4而不是5,就像在你的问题中一样,以防引起麻烦。)
Mma文档声称
AppendTo[a,b]
总是等同于a=Append[a,b]
,这表明它没有修改列表。但我想知道AppendTo是否有时会在认为安全的情况下修改列表;然后,如果它认为它是安全的,而它不是,可能会有恶劣的后果。如果将Append
替换为Append
+普通赋值,是否还会出现奇怪的错误消息和崩溃?这里有几点要介绍。首先,下面的代码没有给我任何错误,所以这里可能发生了其他事情。也许您应该发布产生错误的完整代码块
mydata = Array[Subscript[{##}] &, {5, 3}];
myfirstlist = Range[1, 5];
mysecondlist = Range[6, 10];
Table[AppendTo[mydata[[i]], myfirstlist[[i]]], {i, 4}];
mydata // TableForm
Table[AppendTo[mydata[[i]], mysecondlist[[i]]], {i, 5}];
mydata // TableForm
其次,在这里使用表
没有任何意义,因为您直接修改mydata
<代码>表格将无意义地使用内存
第三,有更好的方法来完成这项任务
看到和
我必须收回我的明确声明,即有更好的方法。将Table
更改为Do
并运行一些快速测试后,对于某些数据来说,这似乎是一种有竞争力的方法
我使用的是Mathematica 7,所以这似乎不是问题。如前所述,在列表中添加列是有必要的,而且,我似乎无法在v上重现这个问题。7.但是,我想把重点放在错误本身上,看看我们是否可以这样纠正它。当Mathematica生成消息Part::partw
时,它会吐出一部分有问题的列表,如
Range[1000][[1001]]
Part::partw: Part 1001 of
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,
31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,<<950>>}
does not exist.
范围[1000][[1001]]
零件号:零件号:第1001部分
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,
31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,}
不存在。
所以,我要问的问题是,哪个列表给了我这些问题?我最好的猜测是它是
mysecondlist
,我会检查Length@mysecondlist
,看看它是否真的有5个元素长。让我们试着澄清一下双转置方法是由什么组成的。我对这种方法的独创性没有任何要求。我的重点是阐述的清晰性
让我们从5个列表开始。首先我们在一张桌子里放三个。然后我们再加上最后两个
food = {"bagels", "lox", "cream cheese", "coffee", "blueberries"};
mammals = {"fisher cat", "weasel", "skunk", "raccon", "squirrel"};
painters = {"Picasso", "Rembrandt", "Klee", "Rousseau", "Warhol"};
countries = {"Brazil", "Portugal", "Azores", "Guinea Bissau",
"Cape Verde"};
sports = {"golf", "badminton", "football", "tennis", "rugby"};
前三个列表——食物、哺乳动物、画家——成为lists3
的元素。它们只是列表,但是TableForm
将它们显示在表中,作为行
(lists3 = {food, mammals, painters}) // TableForm
mydata
将是lists3
的转置名称。现在这三个列表显示为列。这就是换位的作用:列和行被切换
(mydata = Transpose@lists3) // TableForm
这就是问题真正开始的地方。我们如何添加两个附加列(即国家和体育的列表)?让我们来处理剩下的两个列表
(lists2 = {countries, sports}) // TableForm
所以我们可以加入转置[mydata]
和列表2
(lists5 = Join[Transpose[mydata], lists2]) // TableForm
[或者,我们可能有Join
edlists3
和lists2
,因为第二个换位,mydata
的换位撤销了先前的换位。
lists3
只是mydata
的换位(反之亦然)。]
现在,我们只需对结果进行转置
即可获得所需的五个列表的最终表格,每个列表都有自己的列:
Transpose@lists5 // TableForm
我希望这有助于了解如何向表中添加两列。我觉得这条路相当清楚。你可能会发现其他更清晰的方法。好吧,这是我的两分钱,我相信这是一个非常快速且最容易理解的结构 首先,一些测试阵列:
m = RandomInteger[100, {2000, 10000}];
l1 = RandomInteger[100, 2000];
l2 = RandomInteger[100, 2000];
{r, c} = Dimensions[m];
我稍微增加了测试阵列的大小,以提高以下计时测量的准确性
该方法涉及调用Part
([…])、All
和Span
(;)的幂
基本上,在添加两列之后,我使用数据数组的未来维度建立了一个新的工作矩阵,然后使用All
和Span
添加原始矩阵,并仅使用All
添加附加列。然后我将废弃矩阵复制回原始矩阵,因为其他方法也会返回修改后的数据矩阵
n = ConstantArray[0, {r, c} + {0, 2}];
n[[All, 1 ;; c]] = m;
n[[All, c + 1]] = l1;
n[[All, c + 2]] = l2;
m = n;
至于时间安排:
Mean[
Table[
First[
AbsoluteTiming[
n2 = ConstantArray[0, {r, c} + {0, 2}];
n2[[All, 1 ;; c]] = m;
n2[[All, c + 1]] = l1;
n2[[All, c + 2]] = l2;
m2 = n2;
]
],
{10}
]
]
0.1056061
(平均10次)
另一种建议的Do(和OP)方法:
结果是一样的:n = ConstantArray[0, {r, c} + {0, 2}];
n[[All, 1 ;; c]] = m;
n[[All, c + 1]] = l1;
n[[All, c + 2]] = l2;
m = n;
Mean[
Table[
First[
AbsoluteTiming[
n2 = ConstantArray[0, {r, c} + {0, 2}];
n2[[All, 1 ;; c]] = m;
n2[[All, c + 1]] = l1;
n2[[All, c + 2]] = l2;
m2 = n2;
]
],
{10}
]
]
0.1056061
Mean[
Table[
n1 = m;
First[
AbsoluteTiming[
Do[AppendTo[n1[[i]], l1[[i]]], {i, 2000}];
Do[AppendTo[n1[[i]], l2[[i]]], {i, 2000}];
]
],
{10}
]
]
0.4898280
In[9]:= n2 == n1
Out[9]= True