трансляция/расширение булевого массива вдоль оси в python

62
4

Я пытаюсь транслировать логический 1D-массив вдоль вектора, чтобы изолировать определенные операции.

Например, если мой логический массив:

b = array([True False False True])

с

np.shape(b) = (4,)

Моя матрица, которую я хотел бы сделать с серией сравнения, имеет такую форму:

A = array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0], [10.0, 11.0, 12.0]])

с

np.shape(A) = (4, 3)

Конечным результатом я бы хотел:

C = b * A (row-wise comparison) 

C = array([[1.0, 2.0, 3.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [10.0, 11.0, 12.0]])

Я понимаю, что это можно сделать путем нарезки, но мне нужно ускорение скорости от использования логических массивов. Есть ли способ "расширить" логический вектор так, чтобы он работал над строками?

Идея состоит в том, чтобы иметь возможность вычислять функцию в одной строке так, чтобы

D = b * A * (some operation done over all vectors) + ~b * A * (some different operation done over all vectors)

Спасибо!

спросил(а) 2021-01-25T20:46:53+03:00 4 месяца, 3 недели назад
1
Решение
63

Расширьте b до 2D удерживая вторую ось как одноэлементный размер (размер с length = 1) и умножьте на A Таким образом, под капотом b будет транслироваться в ту же форму, что и A и будут выполняться умножения по элементам.

Таким образом, векторизованное решение будет -

A*b[:,None]

ответил(а) 2021-01-25T20:46:53+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема