Wolfram mathematica 如何根据第一个条目中的值从矩阵中提取行?
这是Mathematica中另一个简单的“矩阵”问题。我想展示一下我是如何做到这一点的,并询问是否有更好的答案 我想根据第一列或任何列中的值从矩阵中选择所有“行”,这里我使用第一列作为示例Wolfram mathematica 如何根据第一个条目中的值从矩阵中提取行?,wolfram-mathematica,Wolfram Mathematica,这是Mathematica中另一个简单的“矩阵”问题。我想展示一下我是如何做到这一点的,并询问是否有更好的答案 我想根据第一列或任何列中的值从矩阵中选择所有“行”,这里我使用第一列作为示例 比如说,找到第一个位置的条目为的所有行,下面呢 In[1]:= list = {{1, 2, 3}, {4, 5, 8}, {7, 8, 9}}; In[2]:= Select[list, First[#] <= 4 &] Out[2]= {{1, 2, 3}, {4, 5, 8}} 以下
比如说,找到第一个位置的条目为的所有行,下面呢
In[1]:= list = {{1, 2, 3}, {4, 5, 8}, {7, 8, 9}};
In[2]:= Select[list, First[#] <= 4 &]
Out[2]= {{1, 2, 3}, {4, 5, 8}}
以下是matlab代码的粗略翻译:
list[[Flatten[Position[Thread[list[[All, 1]] <= 4], True]]]]
当然,如果我使用提取液而不是零件,则不需要展平。您可以使用以下方法:
Pick[list, list[[All, 1]], _?(# <= 4 &)]
如果希望行满足条件,请使用以下用例:
如果你想变得非常聪明:
Pick[list, UnitStep[4 - list[[All, 1]]], 1]
这也避免了解包,这意味着它将更快,使用更少的内存 有一种比已经介绍的更快的方法,使用SparseArray。它是: 下面是与其他方法的速度比较。我不得不修改花环的方法来处理其他职位的要求
f1[list_, x_] := Cases[list, {Sequence @@ Table[_, {x - 1}], n_, ___} /; n <= 4]
f2[list_, x_] := Select[list, #[[x]] <= 4 &]
f3[list_, x_] := Pick[list, (#[[x]] <= 4 &) /@ list]
f4[list_, x_] := Pick[list, UnitStep[4 - list[[All, x]]], 1]
f5[list_, x_] := Pick[list, Thread[list[[All, x]] <= 4]]
f6[list_, x_] := list ~Extract~
SparseArray[UnitStep[4 - list[[All, x]]]]["NonzeroPositions"]
这是我尝试的第一件事!但我得到了一个错误,我猜是因为我用了这个表格:POS =位置[List],[1] [OH],对不起,我刚才看到你用“选择”而不是“位置”。我实际上只是想使用位置,因为它返回“索引”,我想用这些来做更一般的事情。这就是为什么我没有考虑选择[]。@Nasser:出现这种错误是因为Position在默认情况下会查看表达式的所有级别。您必须限制级别和/或标头,例如Position[list,\u list?First[]@Simon Only level restriction没有帮助,您必须添加Heads选项:Position[list,\u?First[]False]@Simon,就是这样!级别的技巧。这就是为什么我会出错的原因。否则我会使用它。我没有想到级别。顺便说一句,我在结尾处使用“1”就可以了,而不是{1}。可能{1}更一般。需要研究一下。顺便说一句,如何将文本作为注释中的“代码”?有一个简短的键吗?我看不到{1}在添加评论时,单击任意位置使文本显示为代码。谢谢。很好,+1。我忘记了选择。您也可以使用选择[list,Thread[list[[All,1]]
pos = Position[list, _?(# <= 4 &)];
pos = Select[pos, #[[2]] == 1 &] (*only look at ones in the 'first' column*)
{{1, 1}, {2, 1}}--->
pos = pos[[All, 1]] (* to get list of row positions*)
---> {1, 2}
list[[ pos[[1]] ;; pos[[-1]], All]]
{{1, 2, 3},
{4, 5, 8}}
list = {{1, 2, 3},
{4, 5, 8},
{7 , 8, 9}};
pos = Position[list[[All, 1]], _?(# <= 4 &)]
Extract[list, pos]
--> {{1, 2, 3}, {4, 5, 8}}
list = {{1, 2, 3},
{4, 5, 8},
{7 , 8, 9}}
pos = Position[list, _?(# <= 4 &)];
pos = Select[pos, #[[2]] == 1 &];
pos = pos[[All, 1]];
list[[ pos[[1]] ;; pos[[-1]], All]]
{{1, 2, 3},
{4, 5, 8}}
The above clearly is not too good.
EDU>> A=[1 2 3;4 5 8;7 8 9]
A =
1 2 3
4 5 8
7 8 9
EDU>> A( A(:,1)<=4 , :)
1 2 3
4 5 8
In[1]:= list = {{1, 2, 3}, {4, 5, 8}, {7, 8, 9}};
In[2]:= Select[list, First[#] <= 4 &]
Out[2]= {{1, 2, 3}, {4, 5, 8}}
list[[Flatten[Position[Thread[list[[All, 1]] <= 4], True]]]]
Pick[list, list[[All, 1]], _?(# <= 4 &)]
Cases[list, {n_, __} /; n <= 4]
(* {{1, 2, 3}, {4, 5, 8}} *)
Position[list, {n_, __} /; n <= 4, {1}]
(* {{1}, {2}} *)
Pick[list, UnitStep[4 - list[[All, 1]]], 1]
list ~Extract~
SparseArray[UnitStep[4 - list[[All, 1]]]]["NonzeroPositions"]
f1[list_, x_] := Cases[list, {Sequence @@ Table[_, {x - 1}], n_, ___} /; n <= 4]
f2[list_, x_] := Select[list, #[[x]] <= 4 &]
f3[list_, x_] := Pick[list, (#[[x]] <= 4 &) /@ list]
f4[list_, x_] := Pick[list, UnitStep[4 - list[[All, x]]], 1]
f5[list_, x_] := Pick[list, Thread[list[[All, x]] <= 4]]
f6[list_, x_] := list ~Extract~
SparseArray[UnitStep[4 - list[[All, x]]]]["NonzeroPositions"]
a = RandomInteger[99, {250, 150000}];
timeAvg[#[a, 7]] & /@ {f1, f2, f3, f4, f5, f6} // Column
0.02248
0.0262
0.312
0.312
0.2808
0.0009728
a = RandomInteger[99, {150000, 12}];
timeAvg[#[a, 7]] & /@ {f1, f2, f3, f4, f5, f6} // Column
0.0968
0.1434
0.184
0.0474
0.103
0.002872