Использование python / numpy для создания сложной матрицы - PullRequest
0 голосов
/ 07 января 2020

Используя python / numpy, я хотел бы создать 2D-матрицу M, компоненты которой:

enter image description here

Я знаю, что могу это сделать с кучей циклов for, но есть ли лучший способ сделать это с помощью numpy (без использования циклов for)?


Вот как я пытался, и в итоге я получил ошибку в значении.

Я попытался сначала определить функцию, которая принимает сумму по k:

define sum_function(i,j):
    initial_array = np.arange(g(i,j),h(i,j)+1)
    applied_array = f(i,j,initial_array)
    return applied_array.sum()

, затем я попытался создать матрицу M с помощью np.mgrid следующим образом:

ii, jj = np.mgrid(start:fin, start:fin)
M_matrix = sum_function(ii,jj)

-

(Отредактировано) Позвольте мне записать конкретную форму матрицы в качестве примера: M_ {i, j} = \ sum_ {k = min (i, j)} ^ {i + j} \ sin {\ left ((i + j) ^ k \ right)}

M_ {i, j} = \ sum_ {k = min (i, j)} ^ {i + j} \ sin {\ left ((i + j) ^ k \ right)}

если i, j = 0,1, то эта матрица 2 на 2, и ее форма будет \ bigl (\ begin {smallmatrix} \ sin (0) & \ sin (1) \ \ sin ( 1) & \ sin (2) + \ sin (4) \ end {smallmatrix} \ bigr)

\ bigl (\ begin {smallmatrix} \ sin (0) & \ sin (1) \\ \ sin (1) & \ sin (2) + \ sin (4) \ end {smallmatrix} \ bigr)

Теперь, если матрица станет действительно большой, как бы я создал эту матрицу без использования циклов for?

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Мне кажется, я сам нашел ответ на этот вопрос. Сначала я создаю трехмерный массив F_ {i, j, k} = f (i, j, k). А затем создайте массив mask_array, компонент которого равен Ture, если g (i, j)

M_ {i, j} = \ sum_ {k = min (i, j)} ^ {i + j} \ sin {\ left ((i + j) ^ k \ right)}

#in this example, g(i,j) = min(i,j) and h(i,j) = i+j f(i,j,k) = sin((i+j)^k)
# 0<= i, j <= 2

#kk should range from min g(i,j) to max h(i,j)
ii, jj, kk = np.mgrid[0:3,0:3,0:5]

# k > g(i,j)
frm1 = kk >= jj
frm2 = kk >= ii
frm = np.logical_or(frm1,frm2)

# k < h(i,j)
to = kk <= ii+jj

#mask
k_mask = np.logical_and(frm,to)

def f(i,j,k):
    return np.sin((i+j)**k)

M_before_mask = f(ii,jj,kk)

#Matrix created
M_matrix = (M_before_mask*k_mask).sum(axis=2)
0 голосов
/ 07 января 2020

Чтобы упростить мышление, давайте сравним измерения i,j с одним, ij измерением. Можем ли мы оценить 3 массива:

G = g(ij)   # for all ij values
H = h(ij)
F = f(ij, kk)  # for all ij, and all kk

Другими словами, может ли g,h,f оцениваться по нескольким значениям для получения целых массивов?

Если бы значения G и H были одинаковыми для всех ij или подмножеств (предпочтительно срезов), тогда

F[:, G:H].sum(axis=1)

будет значением для всех ij.

Если разница H-G, размер каждого среза, была одинаковой, то мы можем построить двумерный индексный массив GH такой, что

F[:, GH].sum(axis=1)

В другом слова мы суммируем постоянный размер windows строк F.

Но если различия H-G варьируются по ij, я думаю, что мы застряли с суммой для каждого элемента ij отдельно - с уровнями Python или с уровнями numba или cython.

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