Numpy 在Julia中销毁Iterator.product

Numpy 在Julia中销毁Iterator.product,numpy,julia,Numpy,Julia,我想知道我是否有迭代器。乘积生成对x,y,我如何只从中得到x-component 我正试图用这个从Python/numpy转换成julia。简单的事情: xs = np.arange(0,2*np.pi,0.1) ys = np.arange(0,2*np.pi,0.1) Xs,Ys = np.meshgrid(xs,ys) F = sin(Xs)*cos(Ys) 现在在Julia中我得到了我应该使用Iterator.product 如果使用理解,可以避免在迭代器中使用例程: julia>

我想知道我是否有迭代器。乘积生成对x,y,我如何只从中得到x-component

我正试图用这个从Python/numpy转换成julia。简单的事情:

xs = np.arange(0,2*np.pi,0.1)
ys = np.arange(0,2*np.pi,0.1)
Xs,Ys = np.meshgrid(xs,ys)
F = sin(Xs)*cos(Ys)
现在在Julia中我得到了我应该使用Iterator.product


如果使用理解,可以避免在迭代器中使用例程:

julia> F = [sin(x) * cos(y) for x in xs, y in ys]
63×63 Array{Float64,2}:
  0.0         0.0         0.0         0.0         0.0        …   0.0         0.0         0.0         0.0
  0.0998334   0.0993347   0.0978434   0.0953745   0.0919527      0.0925933   0.0958571   0.098163    0.0994882
  0.198669    0.197677    0.194709    0.189796    0.182987       0.184262    0.190756    0.195345    0.197982
  0.29552     0.294044    0.289629    0.282321    0.272192       0.274089    0.28375     0.290576    0.294498
...
请记住,由于Julia在内存中首先按列组织数组,然后按Python行组织数组,因此如果希望数组在REPL中显示相同的数组,则需要在数组引用中颠倒x和y的顺序,如numpy的meshgrid的“ij”矩阵索引选项:

F = [sin(x) * cos(y) for y in ys, x in xs] # BUT reference elements as e = F[y, x] now

如果使用理解,可以避免在迭代器中使用例程:

julia> F = [sin(x) * cos(y) for x in xs, y in ys]
63×63 Array{Float64,2}:
  0.0         0.0         0.0         0.0         0.0        …   0.0         0.0         0.0         0.0
  0.0998334   0.0993347   0.0978434   0.0953745   0.0919527      0.0925933   0.0958571   0.098163    0.0994882
  0.198669    0.197677    0.194709    0.189796    0.182987       0.184262    0.190756    0.195345    0.197982
  0.29552     0.294044    0.289629    0.282321    0.272192       0.274089    0.28375     0.290576    0.294498
...
请记住,由于Julia在内存中首先按列组织数组,然后按Python行组织数组,因此如果希望数组在REPL中显示相同的数组,则需要在数组引用中颠倒x和y的顺序,如numpy的meshgrid的“ij”矩阵索引选项:

F = [sin(x) * cos(y) for y in ys, x in xs] # BUT reference elements as e = F[y, x] now

你可以使用理解,但我喜欢广播:

xs = range(0, 2π, step=0.1)
ys = range(0, 2π, step=0.1)
F = sin.(xs) .* cos.(ys')  # notice the adjoint '
您应该避免创建中间网格,这只是浪费。事实上,你应该去阅读广播手册:


同样的事情也适用于Python,顺便说一句,不需要网格网格,只要确保xs是行向量,ys是列向量,反之亦然,那么您就可以直接乘以np.sinxs*np.cosys,它们将自动以矩阵形式广播。

您可以使用理解,但我喜欢广播:

xs = range(0, 2π, step=0.1)
ys = range(0, 2π, step=0.1)
F = sin.(xs) .* cos.(ys')  # notice the adjoint '
您应该避免创建中间网格,这只是浪费。事实上,你应该去阅读广播手册:


同样的事情也适用于Python,顺便说一句,不需要网格网格,只要确保xs是行向量,ys是列向量,反之亦然,那么您就可以直接将np.sinxs*np.cosys相乘,它们将自动广播到矩阵形式。

谢谢,很高兴知道,但如何将迭代器上面的复合迭代器xy分解为组件仍然很好。当有第一个和最后一个索引时,也必须有类似于正常索引的内容。您可以再次使用理解:Xs=[x代表x,y代表XYs];Ys=[y代表x,y代表XYs];谢谢,很高兴知道,但是如果能将迭代器上面的复合迭代器xy分解为组件,那就太好了。当有第一个和最后一个索引时,也必须有类似于正常索引的内容。您可以再次使用理解:Xs=[x代表x,y代表XYs];Ys=[y代表x,y代表XYs];谢谢,这样可能更好。。。但无论如何。。。如果有像zip这样的函数,那么也必须有反向函数,也就是解压?不是吗?我听过很多次zip是它自己的反面,但我不确定它是如何工作的。但是如果您只需要每个对的第一个组件,请尝试first.p,其中p是元组/对的集合或迭代器。对于最后一个组件,使用last.p,对于更一般的索引,使用getindex.p,n。问题是,这可以正常工作:Xs=first.XYs,这不起作用:Xs=getindex.XYs,0您无法获取索引0。第一个元素的索引为1.aha…:我更喜欢从零开始数数,但很好。如果getindex是连接到[]运算符的函数,我不能执行类似于XYs。[1]的操作吗?谢谢,这种方式可能更好。。。但无论如何。。。如果有像zip这样的函数,那么也必须有反向函数,也就是解压?不是吗?我听过很多次zip是它自己的反面,但我不确定它是如何工作的。但是如果您只需要每个对的第一个组件,请尝试first.p,其中p是元组/对的集合或迭代器。对于最后一个组件,使用last.p,对于更一般的索引,使用getindex.p,n。问题是,这可以正常工作:Xs=first.XYs,这不起作用:Xs=getindex.XYs,0您无法获取索引0。第一个元素的索引为1.aha…:我更喜欢从零开始数数,但很好。如果getindex是连接到[]运算符的函数,我不能执行类似于XYs。[1]的操作吗?