Попытка использовать двойное условие (?) В цикле определения - PullRequest
0 голосов
/ 08 мая 2018

Используя приведенное ниже определение для массива, определенного как (a * b) в измерении, где a и b равны, скажем, например, 20.Так что а = б = 20.Матрица / массив 20 * 20.

import numpy as np
from numpy.linalg import inv
from scipy.stats import gmean

for n in range(20,21,1):

    X=np.random.uniform(-0.3,0.3,(n))
    Y=np.random.uniform(-0.3,0.3,(n))

    a,b=np.ogrid[-1:n-1:1,-1:n-1:1]

    def f(n, x, y):
        D=np.array(np.exp(1j*(5*np.pi/6)*np.abs((a+x)-(b+y))))
        D[diag,diag]=1-1j/np.sqrt(3)
        #this diag line is just to choose the diagonal elements specifically as they never change.
        return D

    Ddiff = np.abs(np.dstack(inv([f(n, x, y) for x,y in zip(X,Y)])))
    D2diff = gmean(Ddiff,axis=-1)

Я думаю, что этот код создает то, что каждый раз, когда вызывается функция, она берет первый элемент X и Y и использует всю итерацию,Таким образом, в этом примере n = 20, поэтому, когда я вызываю функцию, она создает массив a * b, который равен 20 * 20.Я бы хотел, чтобы каждый элемент X совпадал с a по мере его изменения.т. е. первый элемент a и первый элемент X вызываются одновременно, затем, когда второй элемент a называется вторым элементом X, вызывается и т. д. То же самое с b и Y. это должно создать один массив 20 * 20когда функция вызывается один раз, когда используются все значения в X и Y.

Тогда я бы хотел автоматизировать код для вызова функции 500 раз.Каждый раз, когда вызывается функция, мне нужны X и Y для генерации новых значений.Таким образом, каждый раз, когда создается массив, он будет другим, и я могу использовать np.dstack, чтобы сложить их, и gmean, чтобы взять среднее геометрическое по третьей оси (где массивы сложены).

Код до сих пор создает массив 20 * 20 * 20 перед использованием gmean, поэтому я думаю, что он использует один элемент в массивах X и Y при каждом запуске функции.Если он работает так, как я надеюсь, он должен создать массив 20 * 20 * 500.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

С тех пор я решила, что сама себе жизнь усложняю.

import numpy as np
from numpy.linalg import inv
from scipy.stats import gmean

for n in range(20,21,1):

 X=np.random.uniform(-0.3,0.3,(n))
 Y=np.random.uniform(-0.3,0.3,(n))

 a,b=np.ogrid[-1:n-1:1,-1:n-1:1]

 def f(n, x, y):
     D=np.array(np.exp(1j*(5*np.pi/6)*np.abs((a+x)-(b+y))))
     D[diag,diag]=1-1j/np.sqrt(3)
     #this diag line is just to choose the diagonal elements specifically as they never change.
     return D

 Ddiff = np.abs(np.dstack(inv([f(n, x, y) for x,y in zip(X,Y)])))
 D2diff = gmean(Ddiff,axis=-1)

Я переместил массивы X и Y внутри функции, поэтому каждый раз, когда она вызывается, вызываются также новые X и Y. Я также указал элемент для вызова, просто используя a и b, так как они все равно являются целыми числами. Тогда я просто использую фиктивный индекс для вызова функции 500 раз.

def f(n):
    X=np.random.uniform(-0.3,0.3,(n))
    Y=np.random.uniform(-0.3,0.3,(n))
    D=np.array(np.exp(1j*(5*np.pi/6)*np.abs((a+X[a])-(b+Y[b]))))
    D[diag,diag]=1-1j/np.sqrt(3)
    return D

Ddiff = np.abs( np.dstack( inv(
                                [f(n) for _ in range(500)]
                              )
                         )
              )
D2diff = gmean(Ddiff,axis=-1)
0 голосов
/ 08 мая 2018

Если я правильно понимаю ваши намерения, вы можете достичь этого с помощью встроенного zip .

Ddiff = np.dstack([f(n, x, y) for (x, y) in zip(X, Y)])

Это должно сделать одну 20-длинную итерируемую из вашей 20-длинной X и вашей 20-длинной Y.

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