Преобразование MatLab в Python - индексация? - PullRequest
0 голосов
/ 30 ноября 2019

Я пытаюсь преобразовать следующий код 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;

1 Ответ

0 голосов
/ 01 декабря 2019

Похоже, вы пытаетесь это сделать. Индексирование 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...