给定:方形矩阵和表示要删除的行的索引的列表,它还同时表示要删除的列的索引(它是方形矩阵,因此只需要一个列表)。
输出:方形矩阵,删除列表中的行和列列。
假设有效的指数列表。
这是一个例子
所以上面说的是删除第二行和第四行,以及第二列和第四列。
我无法想象如何使用Delete[]
同时删除行和列,我真的不想列出我想删除的每个单独的元素索引。
但我可以使用Delete
删除行。
下面我如何解决它,我首先删除行,然后转换矩阵,然后删除新矩阵的行(这将是原始的列),然后将结果转换回来获取我的内容想要的。
像这样:a = {{0, 5, 2, 3, 1, 0}, {4, 3, 2, 5, 1, 3}, {4, 1, 3, 5, 3, 2}, {4,
4, 1, 1, 1, 5}, {3, 4, 4, 5, 3, 3}, {5, 1, 4, 5, 2, 0}};
del = {{2}, {4}};
a = Delete[a, del];
a = Delete[Transpose[a], del];
(a = Transpose[a]) // MatrixForm
我的问题:使用删除(或其他专家技巧)是否有更短的方式以更好的方式执行此操作?
感谢
答案 0 :(得分:6)
如果要删除相同的索引列和行,我会使用Part
。例如,要查看a
列和第2行和第4行已删除:
a[[{1, 3, 5, 6}, {1, 3, 5, 6}]] // MatrixForm
为了使它更通用,您可以创建一些将DeleteCases
与Range
和列/行索引组合在一起的内容,但在没有进一步信息的情况下,我没有尝试过这样做(尚)。
修改强>
remove[a_?MatrixQ, pos_List] := Module[{tmp, length = Length[a]},
tmp = DeleteCases[Range[length], Alternatives @@ pos];
a[[tmp, tmp]]
]
remove[a,{2,4}]
{{0, 2, 1, 0}, {4, 3, 3, 2}, {3, 4, 3, 3}, {5, 4, 2, 0}}
<强> EDIT2 强>
remove2[a_?MatrixQ, pos_List] := Module[{tmp, length = Length[a]},
tmp = Complement[Range[length], pos];
a[[tmp, tmp]]
]
remove2[a,{2,4}]
{{0, 2, 1, 0}, {4, 3, 3, 2}, {3, 4, 3, 3}, {5, 4, 2, 0}}
针对您的真实世界问题测试这两个问题。
答案 1 :(得分:4)
这应该是一种比双转置方法更快的删除行的方法:
a = {{0, 5, 2, 3, 1, 0},
{4, 3, 2, 5, 1, 3},
{4, 1, 3, 5, 3, 2},
{4, 4, 1, 1, 1, 5},
{3, 4, 4, 5, 3, 3},
{5, 1, 4, 5, 2, 0}};
del = {{2}, {4}};
a = MapThread[Delete, {a, Table[del, {Length[a]}]}]
时间有所不同,但在这个有点人为的例子中它更快:
a = Table[RandomReal[], {1000}, {10000}];
del = Map[List, Union[Table[RandomInteger[{1, 10000}], {100}]]];
Timing[Transpose[Delete[Transpose[a], del]];]
{0.25,Null}
Timing[MapThread[Delete, {a, Table[del, {Length[a]}]}];]
(0.125,Null}
答案 2 :(得分:1)
这比Part
方法效率低得多,但我觉得它更透明,有时候更重要。
ReplacePart[a, {{2}, {4}, {_, 2}, {_, 4}} :> Sequence[]]
答案 3 :(得分:0)
你当然可以用Drop:
做你的例子Drop[a, {2, 4, 2}, {2, 4, 2}] // MatrixForm
我不知道这是多么普遍,但也许它会帮助你朝着正确的方向前进。