在julia 1.0.3中具有多个条件的findall()或filter()函数

时间:2018-12-28 17:53:07

标签: julia

我正在尝试将以下python代码转换为julia 1.0.3

    from numpy import *
    xl,xr,yl,yr = 0,1,0,1
    xs,ys = linspace(xl,xr,N),linspace(yl,yr,N)

    x,y = np.meshgrid(xs,ys)
    data=column_stack((ravel(x),ravel(y)))     
    idx1 = where((data[:,0]==xl) | (data[:,0]==xr) | (data[:,1]==yl) | (data[:,1]==yr))

我无法转换上述代码的最后一行。我遇到了findall()filter()函数,但在我的情况下无法正确使用它们

1 个答案:

答案 0 :(得分:1)

我了解您希望data保留您可以从xsys的元素创建的所有对,并选择边界上data的元素的索引到idx1。如果是这种情况,这就是我将如何在Julia中实现它:

n=11
xl, xr, yl, yr = 0,1,0,1
xs, ys = range(xl, stop=xr, length=n), range(xl, stop=xr, length=n)
data = [(x,y) for y in ys for x in xs]
idx1 = findall(((x,y),) -> x in (xl,xr) || y in (yl, yr), data)

如果您希望data是矩阵而不是向量,则可以这样做:

data2 = reduce(vcat, [x y] for y in ys for x in xs)
idx12 = filter(i -> data2[i,1] in (xl,xr) || data2[i,2] in (yl, yr), axes(data2, 1))

但在这种情况下,对我而言,在Julia中使用元组向量而不是矩阵会更自然。

您还可以考虑使用Iterators.product函数来生成data这样的vec(collect(Iterators.product(xs, ys)))