首页 > 解决方案 > MatLab 到 Python 的转换 - 索引?

问题描述

我正在尝试将以下 MatLab 代码转换为 Python:

    for i = 1:n
     I = (sum((N==M(1,i))+(N==M(2,i)))==2);
     P(:,i) = pit(:,I);

这是我目前的尝试:

 for i in range(0,n):
     I = [sum(int(N == M)(1,i)) + int((int(N == M)(2,i))) == 2]

这引发了错误:

ValueError: shape mismatch: objects cannot be broadcast to a single shape

我已经翻译的以下 Python 代码(我认为是正确的)在我正在努力解决的代码之前:

 M = np.array(mypitches).transpose()

 n = M.size

 P = np.zeros((3,n))


 pit = pitches(h,-8,12)



 N = np.array(['Fb','Cb','Gb','Db','Ab','Eb','Bb','F-','C-','G-','D-','A-','E-','B-','F#','C#','G#','D#','A#','E#','B#']).transpose()

完整的 MatLab 代码:

function [P] = position(h,mypitches);

% position.m : gives pitch positions given
%        h = aspect ratio
%        mypitches = a list of pitch names from Fb-B#
% returns
%        P = a list of corresponding pc spiral positions
%
% created by EC, 20 Nov 1998; updated 28 Aug 2013
%
% usage:     [P] = position(mypitches)
% example: position(['Bb';'C-']);

M = mypitches';
[m,n] = size(M);

P = zeros(3,n);
pit = pitches2(h,-8,12);

N = ['Fb';'Cb';'Gb';'Db';'Ab';'Eb';'Bb';'F-';'C-';'G-';'D-';'A-';'E-';'B-';'F#';'C#';'G#';'D#';'A#';'E#';'B#']';

for i = 1:n
 I = (sum((N==M(1,i))+(N==M(2,i)))==2);
 P(:,i) = pit(:,I);
end;

标签: pythonmatlab

解决方案


看起来你正在尝试这样做。ndarray 索引是错误的。

for i in range(n):
    I = (sum(int(N == M[0, i]) + int(N == M[1, i])) == 2)
    P[:, i] = pit[:, I]

它可以写得更清楚一点

for i in range(n):
    I = (N == M[0, i] == M[1, i])   # True is equivalent to 1 and False 0
    P[:, i] = pit[:, I]

推荐阅读