Я пытаюсь создать цветное отображение сходимости корней многочлена в сложном пространстве. Чтобы сделать это, я создал сетку точек и применил метод Ньютона к этим точкам, чтобы найти, к какому сложному корню они сходятся. Это дает мне 2d массив комплексных чисел, элементы которого обозначают точку, с которой они сходятся, в пределах некоторого допуска. Я хочу иметь возможность сопоставлять числа в этой матрице с цветовым отображением по элементам.Поиск минимального значения по элементам в трех подматрицах 2d
Я сделал это, итерируя по массиву и вычисляя цвета поэтапно, но он очень медленный и кажется, что это принесет пользу от векторизации. Вот мой код до сих пор:
def colorvec(rootsmatrix, known_roots):
dim = len(known_roots)
dist = ndarray((dim, nx, ny))
for i in range(len(known_roots)):
dist[i] = abs(rootsmatrix-known_roots[i])
Это создает 3D-массив с расстояния, вычисленного корня каждой точки к каждому из фактических корней. Это выглядит примерно так, за исключением 75 000 000 элементов.
[ [ [6e-15 7e-15 0.5]
[1.5 5e-15 0.5] #submatrix 1
[0.75 0.98 0.78] ]
[ [1.5 0.75 0.5]
[8e-15 5e-15 0.8] #submatrix 2
[0.75 0.98 0.78] ]
[ [1.25 0.5 5e-15]
[0.5 0.64 4e-15] #submatrix 3
[5e-15 4e-15 7e-15] ]
Я хочу взять dist
, и возвращают на 1-й размер аргумента (то есть 1, 2, или 3) для каждого 2nd- и 3-размерности аргумента, для которых dist
минимальна. Это будет мое цветовое отображение. Например, сравнение элемента (0,0) каждой из 3 подматриц даст такой цвет (0,0) = 0. Аналогично, цвет (1,1) = 0 и цвет (2,2) = 2. I хотите иметь возможность сделать это для всей цветовой матрицы.
Я не смог найти способ сделать это, используя numpy.argmin
, но мне что-то не хватало. Если есть еще один способ сделать это, я был бы рад услышать, особенно если в нем нет циклов. Я делаю ~ 25MP изображений здесь, поэтому цикл занимает всего 25 минут, чтобы назначить цвета.
Заранее благодарим за ваш совет!
Это ускоряет все в 3 или более раз! Спасибо! – DathosPachy
Прохладный, @ Dathos, рад помочь ... Если последняя часть кажется вам непонятной, стоит прочитать [_broadcasting_ in numpy] (http://docs.scipy.org/doc/numpy/user/ basics.broadcasting.html), потому что он замечательный и волшебный и устраняет всевозможные стандартные циклы. – askewchan