Matlab中的Python zip函数

aurhwmvo  于 2023-08-02  发布在  Python
关注(0)|答案(3)|浏览(130)

我有一些Python代码,我想在Matlab中运行。假设你有两个相同长度的列表:

x = [0, 2, 2, 5, 8, 10]
    y = [0,2, 4, 7, 3, 3]

    P = np.copy(y)
    P.sort()
    P = np.unique(P, axis=0) # P = [0 2 3 4 7]  Takes the list y, sorts it and removes repeated elements

    s = list(zip(x,y))  #match list x with y: s = [(0, 0), (2, 2), (2, 4), (5, 7), (8, 3), (10, 3)]

    for y_1,y_2 in zip(P,P[1:]):  # runs over (0, 2), (2, 3), (3, 4), (4, 7)
        for v_1,v_2 in zip(s, s[1:]):
                -- process --

字符串
在这种情况下:

list(zip(s, s[1:])) = [((0, 0), (2, 2)), ((2, 2), (2, 4)), ((2, 4), (5, 7)), ((5, 7), (8, 3)), ((8, 3), (10, 3))]


我想在Matlab中翻译这个,但我不知道如何复制zip函数。有什么办法吗?

hxzsmxv2

hxzsmxv21#

MATLAB没有zip,但是你可以用不同的方法完成同样的事情。我认为最简单的翻译

for y_1,y_2 in zip(P,P[1:]):
   ...

字符串

for ii = 1:numel(P)-1
   y_1 = P(ii);
   y_2 = P(ii+1);
   ...


一般来说,对zip(x,y)的迭代是通过对索引1:numel(x)进行迭代来完成的,然后使用循环索引索引到数组xy

yqkkidmi

yqkkidmi2#

下面是Python的zip函数在Matlab中的实现。

function out = zip(varargin)
% Emulate Python's zip() function.
%
% Don't actually use this! It will be slow. Matlab code works differently.
args = varargin;
nArgs = numel(args);
n = numel(args{1});
out = cell(1, n);
for i = 1:n
    blah = cell(1, nArgs);
    for j = 1:nArgs
        if iscell(args{j})
            blah(j) = args{j}(i);
        else
            blah{j} = args{j}(i);
        end
    end
    out{i} = blah;
end
end

字符串
但不要使用它;表演会很糟糕。在Matlab中,您希望将事物保存在并行原始数组中,并对这些数组使用向量化操作。或者,如果必须的话,迭代数组索引。

ltqd579y

ltqd579y3#

zip列表解析可以通过

ls0 = [1 2];
ls1 = [3 4];

g = [ls0; ls1]';
cellfun(@(x)[x(1)*0, x(2) + 1], {g(1,:), g(2,:)}, 'UniformOutput', false)

个字符
或者,作为一个一行程序(返回2x2矩阵)

table2array(rowfun(@(x)[x(1)*0, x(2) + 1], table([ls0; ls1]')))


在Python中是

ls0, ls1 = [1, 2], [3, 4]
[(a*0, b + 1) for a, b in zip(ls0, ls1)]
[(0, 4), (0, 5)]

当输入很小时,它们是公平的选择。如果速度/内存是问题,最好专注于MATLAB高效的命令(小心副本)。
可以将其推广到任意数量的列表和理解逻辑(任意函数而不是*0)并引入条件;我已经为dictionaryhere做了这个。
其他答案中的替代,我特别喜欢@AndrewJanke的评论(纯for循环)

c = num2cell([ls0; ls1]');
for col = c
    [a, b] = col{:};
    disp([a, b])
end

相关问题