使用 Julia 将 in() 与元组数组一起使用时出错

Posted

技术标签:

【中文标题】使用 Julia 将 in() 与元组数组一起使用时出错【英文标题】:Error using in() with an array of tuples using Julia 【发布时间】:2018-12-24 07:06:55 【问题描述】:

我有 2 个元组数组,我有一个循环询问一个元素是否在另一个元素中。 在每一步我都会询问坐标数组中包含的元组是否在 Y 数组中。该循环工作正常,除了一个我无法解释原因的元素。这是我所拥有的:

Y[55:65] # This is the array I want to check at each step if my state is in or not.

11 元素数组Any,1: (2.0, 1.0) (3.0, 1.0) (4.0, 1.0) (5.0, 1.0) (6.0, 1.0) (7.0, 1.0) (8.0, 1.0) (9.0, 1.0) (10.0, 1.0) (11.0, 1.0) (12.0, 1.0)

coord[i-1]  # this is one element of coord that is in Y

0维数组TupleFloat64,Float64,0: (6.0, 1.0)

coord[i] # this is an other element of coord that is in Y

0维数组TupleFloat64,Float64,0: (7.0, 1.0)

但是当我测试它们在 Y 时:

in(coord[i],Y[55:65]) # testing if coord[i] is in Y

in(coord[i-1],Y[55:65]) # testing if coord[i-1] is in Y

是的

我不明白:它们在 Y 中都以相同的方式表示,它们具有相同的类型,为什么我使用 in() 得到一个在而不是另一个?

我使用 Julia 版本 0.6.3。

提前感谢您的帮助!

【问题讨论】:

很可能Y[55:65] 包含包装在 0 维数组中的 (7.0, 1.0),而 (6.0, 1.0) 未包装。它们以相同的方式打印,因此仅使用目视检查很难区分它们。但这可能是这种情况,因为Y[55:65]VectorAny,所以它似乎包含混合类型。你能发布typeof.(Y[55:65])的结果吗? 感谢您的帮助。 typeof.(Y[55:65]) 给:11-element ArrayDataType,1: ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 我找不到这两个有什么区别。 好像类型是一样的。那么Y[60] == coord[i] 比较返回什么?如果是false,那么Y[60][][1] == coord[i][][1]Y[60][][2] == coord[i][][2] 会返回什么?如果这两个返回 false 中的任何一个,则实际上元组的条目不相等(如果您使用 Float64 可能会发生这种情况,因为四舍五入)。 感谢您的帮助,是的,我意识到这些值确实不完全相等,但机器精度不同。这很奇怪,因为我做了类似 7/100*100 的事情,我没想到会发生这种情况!谢谢 【参考方案1】:

您是如何获得coordY 的?如果您通过计算而不是直接分配获得它们,即使它们显示出来,它们也可能不完全相等。例如:

julia> p1 = fill((6.0, 1.0))
0-dimensional ArrayTupleFloat64,Float64,0:
(6.0, 1.0)

julia> p2 = fill((7.0 + 3eps(), 1.0))
0-dimensional ArrayTupleFloat64,Float64,0:
(7.000000000000001, 1.0)

julia> Y = [p1, p2]
2-element ArrayArrayTupleFloat64,Float64,0,1:
 (6.0, 1.0)
 (7.0, 1.0) # NOTE that it get truncated in display but the content did not changed!

julia> x = fill((6.0, 1.0))
0-dimensional ArrayTupleFloat64,Float64,0:
(6.0, 1.0)

julia> x in Y
true

julia> x = fill((7.0, 1.0))
0-dimensional ArrayTupleFloat64,Float64,0:
(7.0, 1.0)

julia> x in Y
false

如果是这种情况,您可以在比较之前对它们进行四舍五入,或者使用isapprox(或 运算符,在Julia 中通过\approx + Tab 键入)手动编写in 函数

【讨论】:

是的,这就是问题所在!但我之前没有考虑过,因为我计算的方式是 7/100*100。很高兴知道未来!非常感谢。 isapprox 听起来更合适,我会检查精度。

以上是关于使用 Julia 将 in() 与元组数组一起使用时出错的主要内容,如果未能解决你的问题,请参考以下文章

Julia:扁平化数组/元组数组

零基础学python-2.7 列表与元组

Scala学习之数组与元组

将字符串与元组列表匹配

如何将`inSet`与列的元组一起使用?

python学习笔记之列表与元组