Более быстрый способ замены больших значений матрицы на меньшие значения матрицы при заданных индексах? - PullRequest
0 голосов
/ 06 января 2019

Есть ли более быстрый способ выполнить это?

Размеры:

  • proj: 400 x 400

  • bigproj: 30 000 x 30 000

  • totalproj: 30 000 x 30 000

ds1 и ds2 (каждая из форм: 6k x 400) - это матрицы, извлеченные из больших матриц (DS1 и DS2), где каждая имеет форму 6k x 30k. proj является результатом выполнения некоторых функций для ds1 и ds2. origindex являются индексами столбцов DS1 или DS2

ds1 = DS1[:,origindex]
ds2 = DS2[:,origindex]
proj = somefunction(ds1,ds2)

for m, n in product(range(proj.shape[0]), range(proj.shape[1])):
    bigproj[origindex[m], origindex[n]] = proj[m, n]  
    totalproj += bigproj

Похоже, что последняя строка добавления матриц занимает больше всего времени.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Вы можете векторизовать первую часть цикла с помощью np.mgrid:

m, n = proj.shape
bigproj[tuple(origindex[np.mgrid[:m, :n]])] = proj

Если вы действительно хотели выполнить вторую часть в письменном виде (totalproj += bigproj), то есть добавить текущую версию bigproj на на каждую итерацию , вы можете сделать это с помощью :

bigproj[tuple(origindex[np.mgrid[:m, :n]])] = proj * np.arange(1, m*n+1).reshape(m, n)
0 голосов
/ 06 января 2019

Если bigproj и totalproj являются списками списков, то поведение по умолчанию + = добавит все элементы из одного списка в другой. Таким образом, на каждой итерации этого цикла totalproj увеличивается на 30000 x 30000 элементов.

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

...