Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia中的多维数组理解_Julia - Fatal编程技术网

Julia中的多维数组理解

Julia中的多维数组理解,julia,Julia,我和茱莉亚混在一起,似乎无法理解多维数组。我正在为OSX使用每晚0.20-pre的构建;这可能是构建中的一个bug。然而,我怀疑这是用户的一个bug 比如说,我想以这样的方式结束: 5x2 Array 1 6 2 7 3 8 4 9 5 10 我不想只调用重塑。据我所知,多维数组应该生成如下内容:[(x,y)在1:5中表示x,在6:10中表示y]。但这会生成一个5x5元组数组: julia> [(x, y) for x in 1:5, y in 6:10] 5x5 Array{(Int6

我和茱莉亚混在一起,似乎无法理解多维数组。我正在为OSX使用每晚0.20-pre的构建;这可能是构建中的一个bug。然而,我怀疑这是用户的一个bug

比如说,我想以这样的方式结束:

5x2 Array
1 6
2 7
3 8
4 9
5 10
我不想只调用
重塑
。据我所知,多维数组应该生成如下内容:
[(x,y)在1:5中表示x,在6:10中表示y]
。但这会生成一个5x5元组数组:

julia> [(x, y) for x in 1:5, y in 6:10]
5x5 Array{(Int64,Int64),2}:
 (1,6)  (1,7)  (1,8)  (1,9)  (1,10)
 (2,6)  (2,7)  (2,8)  (2,9)  (2,10)
 (3,6)  (3,7)  (3,8)  (3,9)  (3,10)
 (4,6)  (4,7)  (4,8)  (4,9)  (4,10)
 (5,6)  (5,7)  (5,8)  (5,9)  (5,10)
或者,也许我想为每个值生成一组值和布尔代码:

5x2 Array
1 false
2 false
3 false
4 false
5 false
同样,我似乎只能创建一个元组数组,其
{(x,y)为1:5的x,y=false}
。如果我删除
x,y
周围的paren,我会得到
错误:语法:数组表达式中缺少分隔符
。如果我把
x,y
包装在某个东西中,我总是会得到那种输出--
数组
数组{Any}
,或者
元组


我猜:有些事情我就是不明白。有人愿意帮我理解什么吗?

我想你只是看错了清单

julia> [x+5y for  x in 1:5, y in 0:1]
5x2 Array{Int64,2}:
 1   6
 2   7
 3   8
 4   9
 5  10
当您在多个维度中使用它们时,您会得到两个变量,并且需要一个基于坐标的单元格值函数

关于你的第二个问题,我认为你应该重新考虑你的要求。Julia使用类型化数组来提高性能,并且可以在不同的列中存储不同的类型。要获得非类型化数组,可以使用{}而不是[],但我认为更好的解决方案是使用一个元组数组(Int,Bool),或者更好的方法是使用两个数组(一个用于Int,一个用于Bool)


我认为你的理解力不适合你想做的事。原因可在以下文件中找到:

这种形式的含义是,F(x,y,…)是用变量x,y等计算的,这些变量取给定值列表中的每个值。值可以指定为任何iterable对象,但通常是1:n或2:(n-1)之类的范围,或者是[1.2,3.4,5.7]之类的显式值数组结果是一个N-d密集数组,其维数是变量范围rx、ry等维数的串联,每个F(x,y,…)求值返回一个标量。

这里需要注意的是,如果您将其中一个变量设置为>1维数组,它似乎首先变平;因此,“结果是……一个数组,其维数是变量范围rx、ry等的维数的串联”这句话并不准确,因为如果rx为2x2,ry为3,则不会得到2x2x3的结果,而是4x3的结果。但是,根据上面的内容,您得到的结果应该是有意义的:您返回的是一个元组,所以这就是数组单元格中的内容。返回的元组不会自动扩展到数组的行中

如果要从压缩中获取5x2数组,则需要确保
x
的长度为5,而
y
的长度为2。然后,每个单元格将包含函数的结果,并将
x
y
中的每个可能的元素对作为参数进行计算。问题是,示例数组单元格中的值实际上不需要计算两个参数的函数。相反,您要做的只是将两个预先确定的列粘在一起,形成一个二维数组。为此,请使用
hcat
或文字:

  • hcat(1:5,6:10)
  • [1:5:10]
  • hcat(1:5,falses(5))
  • [1:5假(5)]
如果要创建一个二维数组,其中第2列包含在第1列上计算的函数的结果,可以这样理解:

f(x) = x + 5
[ y ? f(x) : x for x=1:5, y=(false,true) ]
但这有点让人困惑,我觉得这样做更直观

x = 1:5
hcat( x, map(f,x) )
这是另一种(尽管很复杂)方式:

正如@ivarne所指出的那样

[{x,false} for  x in 1:5]

会起作用并给你一些可变的东西

我有点像@fawr在保持可变性的同时给出的数据类型效率的答案,但这很快就能满足你的要求(根据Shawn的答案):

第二部分中的单元数组理解强制数据类型为Any而不是IntXX

这也适用于:

hcat(1:5,{i for i in falses(5)})

除了理解之外,我还没有找到另一种方法来显式地将数组转换为Any类型。

你的直觉是写
[(x,y)在1:5中表示x,在6:10中表示y]
,但你需要的是将范围封装在
zip
中,如下所示:

[i for i in zip(1:5, 6:10)]
这会给你一些非常接近你需要的东西,即:

5-element Array{(Int64,Int64),1}:
(1,6) 
(2,7) 
(3,8) 
(4,9) 
(5,10)
要准确获取所需内容,您需要:

hcat([[i...] for i in zip(1:5, 6:10)]...)'
这将为您提供:

5x2 Array{Int64,2}:
1   6
2   7
3   8
4   9
5  10

我找到了一种通过
vcat
splat
操作符生成数值多维数组的方法:

R = [ [x y] for x in 1:3, y in 4:6 ] # make the list of rows
A = vcat(R...) # make n-dim. array from the row list
然后,
R
将是一个
3x3数组{Array{Int64,2},2}
,而
a
是一个
9x2数组{Int64,2}
,如您所愿

对于第二种情况(一组值和每个值的布尔代码),可以执行以下操作

R = [[x y > 5] for x in 1:3, y in 4:6] # condition is y > 5
A = vcat(R...)
其中
A
将是
9x2数组{Int64,2}
,其中
true
/
false
1
/
0
表示


我已经在Julia 0.4.7中测试过了。

好的,这加上@ivarne下面的评论是有道理的。我来自Python,但很明显,我在第一次阅读时并没有仔细阅读手册。感谢您帮助澄清!我剩下的问题是:我发现了
[1:5 false(5)]
,这是完美的,只是它将
false
编码为0。Julia文档指定Julia不使用0/1进行布尔编码
0==false
返回true,但是
if(0)
抛出类型错误。有没有一种方法可以使用返回布尔值而不是整数编码的布尔值来
hcat
数字?@Gastove是的,这里发生的是
false
s正在被删除<
hcat([[i...] for i in zip(1:5, 6:10)]...)'
5x2 Array{Int64,2}:
1   6
2   7
3   8
4   9
5  10
R = [ [x y] for x in 1:3, y in 4:6 ] # make the list of rows
A = vcat(R...) # make n-dim. array from the row list
R = [[x y > 5] for x in 1:3, y in 4:6] # condition is y > 5
A = vcat(R...)