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

时间:2018-05-08 15:14:20

标签: 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匹配。即同时调用X的第一个元素和第一个元素,然后当调用a的第二个元素时,调用X的第二个元素。与b和Y相同。这应该产生一个20 * 20的数组当函数被调用一次时,使用X和Y中的所有值。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

这应该使你的20长X和你的20长Y可以进行20次长度的迭代。

答案 1 :(得分:0)

此后我发现自己的生活很艰难。

<dg:DataGridTemplateColumn.CellStyle>
    <Style TargetType="dg:DataGridCell">
        <Setter Property="HorizontalAlignment"  Value="Center"/>
    </Style>
</dg:DataGridTemplateColumn.CellStyle>

我已将<dg:DataGridTemplateColumn.CellStyle> <Style TargetType="dg:DataGridCell"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type dg:DataGridCell}"> <Grid Background="{TemplateBinding Background}"> <ContentPresenter HorizontalAlignment="Center" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </dg:DataGridTemplateColumn.CellStyle> 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) 数组移到函数内部,因此每次调用它时,都会调用新的XY。我还指定了仅使用XY调用的元素,因为它们是整数。然后我只使用一个虚拟索引来调用该函数500次。

a