Сопоставьте каждый элемент одного массива с элементами другого массива без циклов

Я хочу сопоставить каждый элемент одного массива (lessnum) с элементами другого массива, например (cc). Затем умножьте на число из третьего массива (gl). Я делаю с помощью циклов. Длина массивов очень большая, поэтому это занимает пару часов. Можно ли обойтись без петель или сделать быстрее. Вот код, который я делаю,

uniquec=sort(unique(cc));
maxc=max(uniquec);
c35p=0.35*maxc;
lessnum=uniquec(uniquec<=c35p);
greaternum=uniquec(uniquec>c35p);
gl=linspace(1,2,length(lessnum));
gr=linspace(2,1,length(greaternum));
 newC=zeros(size(cc));
for i=1:length(gl)
    newC(cc==lessnum(i))= cc(cc==lessnum(i)).*gl(i);
end
for i=1:length(gr)
    newC(cc==greaternum(i))= cc(cc==greaternum(i)).*gr(i);
end
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что вам нужно сделать, так это вместо хранения значений, которые меньше или больше c35p в lessnum и greaternum соответственно, вы должны хранить индексы этих чисел. Таким образом, вы можете напрямую получить доступ к переменной newC, используя эти индексы, а затем умножить ваши линейно сгенерированные значения.

Дальнейшие модификации объясняются в самом коде. Если у вас есть какие-либо затруднения, вы можете прочитать справку для unique

Вот модифицированный код (я предполагаю, что cc — это одномерный массив)

%randomly generate a cc vector
cc = randi(100, 1, 10);
% modified code below
[uniquec, ~, induniquec]=unique(cc, 'sorted'); % modified to explicitly specify the inbuilt sorting capability of unique and generate the indicies of unique values in the array
maxc=max(uniquec);
c35p=0.35*maxc;
lessnum=uniquec<=c35p; % instead of lessnum=uniquec(uniquec<=c35p);
greaternum=uniquec>c35p; % instead of greaternum=uniquec(uniquec>c35p);
gl=linspace(1,2,sum(lessnum));
gr=linspace(2,1,sum(greaternum));
% now there is no need for 'for' loops. We first modify the unique values as specified and then regenerate the required matrix using the indices obtained previously
newC=uniquec;
newC(lessnum) = newC(lessnum) .* gl;
newC(greaternum) = newC(greaternum) .* gr;
newC = newC(induniquec);

Этот новый код будет работать намного быстрее, чем исходный, но требует гораздо больше памяти в зависимости от количества уникальных значений в исходном массиве.

Спасибо, что указали на это @EliahuAaron. Мой код неправильно обрабатывал повторяющиеся значения. Исправит.

ammportal 22.05.2019 14:06

Да, намного быстрее, отличная техника, newC = newC(induniquec); позволяет избежать умножения с gl и gr для повторяющихся значений. Он потребляет больше памяти.

Eliahu Aaron 22.05.2019 15:51

@ammportal Если я выполняю по одному оператору и если выполняю newC(greaternum) = newC(greaternum) .* gr; до newC(lessnum) = newC(lessnum) .* gl;, я получаю другую ошибку. Невозможно выполнить присваивание, так как левая и правая стороны содержат разное количество элементов.

Kanjoo 22.05.2019 16:30

Здравствуйте, ваш ответ великолепен. Но в моем случае длина массива составляет 10342656. Matlab выдает мне ошибку нехватки памяти в newC(lessnum) = newC(lessnum) .* gl; . Недостаточно памяти. Введите «помощь памяти» для ваших вариантов. Хотя оперативки у меня 64гб.

Kanjoo 22.05.2019 16:34

@ammportal Я получил ответ. Я только что сделал векторы-столбцы gr и gl вместо векторов-строк, потому что все остальные являются векторами-столбцами. Спасибо за отличный ответ.

Kanjoo 22.05.2019 16:55

@EliahuAaron Да. Определенно занимает больше памяти, но я думаю, что это нормально для целей OP.

ammportal 22.05.2019 18:16

@Kanjoo Рад помочь вам. Просто убедитесь, что в вашем коде все работает должным образом. Возможно, сравните значения, полученные для вашего предыдущего кода и этого.

ammportal 22.05.2019 18:17

Другие вопросы по теме