python - 尝试在定义循环中使用双重条件(?)

标签 python arrays function numpy

使用下面的定义将数组定义为维度 (a*b),其中 a 和 b 相等,例如 20。所以a=b=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,所以当我调用该函数时,它将产生一个 20*20 的 a*b 数组。我希望 X 的每个元素在变化时与 a 相匹配。即a的第一个元素和X的第一个元素同时被调用,然后当a的第二个元素被调用时,X的第二个元素被调用等等。与b和Y相同。这应该产生一个20*20的数组当函数被调用一次时,X 和 Y 中的所有值都被使用。

然后我想自动化代码来调用该函数 500 次。每次调用该函数时,我都需要 X 和 Y 来生成新值。这样,每次生成数组时,它都会有所不同,我可以使用 np.dstack 来堆叠它们,并使用 gmean 沿第三轴取几何平均值(其中数组是堆叠的)。

到目前为止,代码在使用 gmean 之前会生成一个 20*20*20 的数组,这就是为什么我认为每次函数运行时它都会使用数组 X 和 Y 中的一个元素。如果它按我希望的那样工作,它应该生成一个 20*20*500 的数组。

最佳答案

如果我正确理解您的意图,您可以通过 zip builtin 来实现此目的。

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

这应该可以从 20 长的 X 和 20 长的 Y 中生成一个 20 长的迭代。

关于python - 尝试在定义循环中使用双重条件(?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50236942/

相关文章:

c - int* ptr 和 int(* arr)[3] =&a 之间的区别

c - C程序输出错误

javascript - 访问 javascript 严格函数

python - Apache Nutch 的任何替代品?

python - 根据 pandas 中另一列的值在 groupby 之后应用 lambda 函数

c - 使用指针以相反顺序检索值

java - 调用函数而不存储返回值

python - 同一个迭代器的多个迭代器(使用枚举),这是怎么回事?

python - 使用 Python 求解行列式而不使用 scipy.linalg.det 的代码

c++ - 关联数组、数组和树