Ситуация:
Я заполняю массив формы (2N, 2N), где N близко к 8000, назовем его A, со значениями, которые я получаю из функциииспользуя вложенные циклы for для вызова функции, которая принимает в качестве аргумента подмассивы shape (2,) из последнего измерения массива shape (N, N, 2), назовите его B.
Это, очевидно, дорогои хотя мне не удалось векторизовать эту часть кода (любая помощь в этом направлении также очень приветствуется), я знаю, что B имеет много повторяющихся подмассивов в последнем измерении.Итак, я хочу выяснить уникальные подмассивы и где каждый встречается.Тогда заполнение A будет ускоряться путем итерации по каждому из этих уникальных подмассивов и заполнения всех позиций, где это происходит, значением, возвращаемым функцией, которая была бы вычислена только один раз.
Что яЯ сделал следующее, но это, кажется, не самый простой способ продолжить, или самый тупой способ сделать это.
Код, который я использовал для Заполните матрицу следующим образом:
translat_avg_disloc_matrix = np.zeros([2*n, 2*n])
for i in range(n):
for alpha in range(2):
for j in range(n):
for beta in range(2):
translat_avg_disloc_matrix[2*i+alpha,2*j+beta] = average_lat_pos(alpha, beta, b_matrix[i][j])
Хотя я могу найти уникальные подмассивы, выполнив что-то вроде того, что здесь сделано: Эффективно посчитать количество экземпляров уникальных подмассивов в NumPy? ), У меня были проблемы с поиском индексов, где каждый из них встречается.
То, что я пробовал делает что-то вроде:
1) Вычисляет норму подмассивов в последнем измерении B на norm = (B*B).sum(axis=2)
и вычисляет нормуподмассивы в последнем измерении B-1
на norm_ = ((B-1)*(B-1)).sum(axis=2)
2) Изменение этих массивов для этих двух норм с помощью norm.reshape((norm.size,1))
3) Создание матриц плиткикак tile_norm = np.tile(norm.T, (len(norm),1))
4) Затем делаем np.unique(np.non_zero(np.abs(tile_norm - norm)+np.abs(tile_norm_-norm_) == 0), axis=0)
, что дает нам что-то вроде: array([[0, 0, 0, 4], [4, 4, 4, 0]])
, где в каждой строке нули указывают, что эти индексы соответствуют одному и тому же (2,) в матрице B.
Словом, я нахожу (2,) массивы, нормы которых совпадают как есть, и которые также согласуются, когда 1 вычтено из них - два уравнения, две переменные.
ЧтоЯ ищу - это способ найти, где каждый из уникальных подмассивов встречается в B, так что использование некоторой необычной индексации позволит мне заполнить матрицу без повторных вызовов функции average_lat_pos
(повторение здесь означает вызовдля той же (альфа, бета, (2,) массива) упорядоченной пары).