как применить 2d маску к 1d массиву - PullRequest
0 голосов
/ 28 апреля 2020

Каков наилучший способ применить 2d маску к 1d массиву? скажем, у нас есть массив a формы (k, n), массив b формы (k, 1) и маска формы (k, n), которую я хочу вычислить

c = np.zeros_like(a)
for i in range(a.shape[1]):
    c[mask[:, i], i] = a[mask[:, i], i] - b[mask[:, i]]

есть более эффективный способ, чем использовать np.repat?

c[mask] = a[mask] - np.repeat(b, a.shape[1], axis=1)[mask]

, например:

a = np.arange(25).reshape(5, 5)
b = np.ones((5, 1))
mask = np.random.randint(0, 2, (5, 5), dtype=np.bool)
c = np.zeros_like(a)
c[mask] = a[mask] - np.repeat(b, a.shape[1], 1)[mask]

1 Ответ

0 голосов
/ 28 апреля 2020

Способ инициализации массива c не подлежит сомнению.

Затем, чтобы выполнить вашу "выборочную" замену, запустите:

c = np.where(mask, a - b, c)

Подробности:

  • a - b - вычтите b из каждого столбца a. В настоящее время без маски.
  • np.where(...) - принимать значения из a - b, но только элементы, "обозначенные" истинными значениями в маске. Другие элементы берутся из c.
  • c = ... - Сохранить результат обратно в c.

Таким образом, маска применяется к 2-D массивы:

  • исходный массив c,
  • и временный массив, созданный путем вычитания широковещательных b массива a.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...