Wolfram 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}} 以下

这是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}}
以下是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