假设我现在有一个矩阵
S = [1 1 1 2 2 2;
1 1 1 2 2 2;
2 2 2 2 1 1;
2 2 2 2 1 1;
2 2 2 2 1 1]
另一个矩阵
A = [1 2;
2 4]
A中的第一行是S的唯一索引,第二行包含第一行中的值将被替换的值。也就是说,S中的所有“1”将被2替换,所有“2”将被替换为4.最后我将得到一个矩阵
SS = [2 2 2 4 4 4;
2 2 2 4 4 4;
4 4 4 4 2 2;
4 4 4 4 2 2;
4 4 4 4 2 2]
现在我正在做的是:
SS = zeros(size(S));
for i = 1:size(A,2)
SS(S==index(A(1, i)) = A(2,i);
end
现在,我有一个非常大的矩阵,使用for循环有点慢。有没有更快的方法呢?
答案 0 :(得分:3)
使用ismember
的第二个输出为A的第1行中的值提供索引。使用这些索引直接创建矩阵SS
。
示例(为清晰起见,更改了初始值):
S = [5 5 5 3 3 3; 5 5 5 3 3 3; 3 3 3 3 5 5; 3 3 3 3 5 5; 3 3 3 3 5 5]; A = [5 3; 2 4];
>> [~, Locb] = ismember(S,A(1,:))
Locb =
1 1 1 2 2 2
1 1 1 2 2 2
2 2 2 2 1 1
2 2 2 2 1 1
2 2 2 2 1 1
>> SS = reshape(A(2,Locb),size(S))
SS =
2 2 2 4 4 4
2 2 2 4 4 4
4 4 4 4 2 2
4 4 4 4 2 2
4 4 4 4 2 2
答案 1 :(得分:1)
如果我正确理解了你的问题,我会使用numpy数组而不是标准的python数组或列表。然后代码变得非常简单,如下所示:
# Import numpy
from numpy import array, zeros, shape
# Create the array S
S = array([[1,1,1,2,2,2],[1,1,1,2,2,2],[2,2,2,2,1,1],[2,2,2,2,1,1],[2,2,2,2,1,1]])
# Create the array A
A = array([[1,2],[2,4]])
# Create the empty array SS
SS = zeros((shape(S)))
# Actual operation needed
SS[S==A[0,0]]=A[1,0]
SS[S==A[0,1]]=A[1,1]
现在,如果您看到数组SS,它将如下所示:
SS
array([[ 2., 2., 2., 4., 4., 4.],
[ 2., 2., 2., 4., 4., 4.],
[ 4., 4., 4., 4., 2., 2.],
[ 4., 4., 4., 4., 2., 2.],
[ 4., 4., 4., 4., 2., 2.]])
很抱歉早先的混乱。我(由于某种原因)认为这个问题是针对Python的(我的坏!)。无论如何,MATLAB的答案非常相似:
SS = zeros(size(S))
SS(S==A(1,1))=A(2,1)
SS(S==A(1,2))=A(2,2)
答案 2 :(得分:1)
你可以使用arrayfun
单行代码进行此操作,如下所示:
SS = arrayfun(@(x)A(2, (A(1, :) == x), S)