Мин / макс транслируемых массивов - PullRequest
0 голосов
/ 26 сентября 2019

Есть ли способ эффективно сравнить несколько массивов, которые транслируются вместе?Например:

a = np.arange( 0,  9).reshape(3,3)
b = np.arange( 9, 18).reshape(3,3)
c = np.arange(18, 27).reshape(3,3)

Если бы я транслировал их следующим образом:

abc = a[:,:,None,None,None,None] + b[None,None,:,:,None,None] + c[None,None,None,None,:,:]

Тогда каждый элемент abc равен a_ij + b_kl + c_mn, где ij, kl и mn индексируют соответствующие массивы.Вместо этого я хотел бы получить min(a_ij, b_kl, c_mn) или, в идеале, max(a_ij, b_kl, c_mn) - min(a_ij, b_kl, c_mn).Есть ли эффективный способ, которым я могу сделать это?

Я мог бы, конечно, транслировать временные массивы как:

Abc =     a[:,:,None,None,None,None] + 0 * b[None,None,:,:,None,None] + 0 * c[None,None,None,None,:,:]
aBc = 0 * a[:,:,None,None,None,None] +     b[None,None,:,:,None,None] + 0 * c[None,None,None,None,:,:]
abC = 0 * a[:,:,None,None,None,None] + 0 * b[None,None,:,:,None,None] +     c[None,None,None,None,:,:]

, а затем найти мин / макс из этих массивов, однакоэти массивы могут быть довольно большими.Было бы лучше, если бы был какой-то способ сделать это за один шаг.

И, как дополнительное примечание, эти массивы гарантированно могут быть переданы, но не обязательно имеют одинаковую форму (например, (1, 3)и (3, 3)).

1 Ответ

1 голос
/ 26 сентября 2019

Вы можете сохранить промежуточный массив (меньше, чем ваш конечный результат в любом случае), выполнив операцию на a и b:

temp = np.minimum.outer(a.ravel(), b.ravel())
res = np.minimum.outer(temp.ravel(), c.ravel())

, а затем повторите эту же операцию с c.minimum вычисляет поэлементный минимум из 2 массивов.Поскольку это ufunc, вы можете использовать outer, чтобы применить эту операцию ко всем парам значений для этих двух массивов.

Вы можете изменить res по своему усмотрению.

Edit # 1

Благодаря комментарию P. Panzer вам не нужно использовать массивы 1D с ufunc.outer, что приводит к еще более простому коду:

temp = np.minimum.outer(a, b)
res = np.minimum.outer(temp, c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...