Как иметь конкретные условия для каждого элемента для матрицы или 2d массива в Python? - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть несколько матриц, и я хочу создать еще одну 'g' на основе предыдущих матриц, которые я создал.У меня есть общая формула для генерации моей матрицы «g», однако я хочу изменить некоторые из них на основе моей матрицы «тета».Если элемент в 'theta' имеет нулевое значение, я хочу получить местоположение этого элемента и найти элемент с таким же местоположением в 'g', чтобы применить вторую формулу.

В настоящее время у меня есть этот кодниже.Но проблема в том, что он работает довольно медленно.Я должен сгенерировать несколько матриц, похожих на это, и мне интересно, если кто-нибудь знает более быстрый способ сделать это?Заранее спасибо!

import numpy as np
np.seterr(divide='ignore', invalid='ignore')

x = np.linspace(-100.0, 100.0, 401)

y = np.linspace(100.0, -100.0, 401)
xx, yy = np.meshgrid(x, y)

xxx = xx / 10
yyy = yy / 10

r = np.sqrt((xxx ** 2.0) + (yyy ** 2.0))

theta = np.degrees(np.arctan(xxx / yyy))

m = 1.5

uv = (xxx * xxx) + ((yyy - (m / 2)) * (yyy + (m / 2)))
umag = np.sqrt((xxx ** 2) + ((yyy - (m / 2)) ** 2))
vmag = np.sqrt((xxx ** 2) + ((yyy + (m / 2)) ** 2))

theta2 = np.arccos(uv / (umag * vmag))
g = np.absolute(theta2 * 1000 / (m * xxx))

l = len(g)

for a in range(l):
    for b in range(len(g[a])):
         if (theta[a][b] == 0):
             g[a][b] = 1 * 1000 / ((r[a][b]**2) - ((m**2) / 4))
             print(g)
         else:
             pass

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Хорошо, это сработало довольно хорошо.Я изменил свой цикл for на этот:

 row, col = np.where(theta == 0)

 for elements in g[row,col]:
     g[row,col] = 1 * 1000 / ((r[row,col]**2) - ((m**2) / 4))

Теперь он работает намного быстрее, так что проверка всех элементов исключена.Код теперь только проверяет, где выполняется условие.Большое спасибо !!

0 голосов
/ 02 февраля 2019

Вы можете использовать np.where(theta == 0).Возвращает кортеж.

>>> a
array([[1, 2],
       [2, 3],
       [5, 6]])
>>> np.where(a==2)
(array([0, 1]), array([1, 0]))

Проверьте это для более подробной информации

...