朱莉娅不精确错误:Int64

4

我是Julia的新手。遇到了这个InexactError错误。说明一下,我已经尝试过先转换为浮点数,但没有成功,可能是我做错了什么。

column = df[:, i]  
max = maximum(column)
min = minimum(column)
scaled_column = (column .- min)/max   # This is the error, I think
df[:, i] = scaled_column

julia> VERSION
v"1.4.2"

2
“i”是什么?在这里,更完整的MWE将非常有帮助。 - Oscar Smith
你能否尝试提供一个完整的示例来重现错误,并粘贴完整的错误信息?此外,我不建议使用max和min作为变量名,因为这些名称在Julia函数中已经被占用。最后,我认为你还应该在除法运算符前加上一个点。 - aramirezreyes
2个回答

7

没有提供问题的最小工作示例,很难给出确切的答案。但一般来说,当您尝试将一个值转换为精确类型(如整数类型,但不像浮点类型)时,如果原始值无法精确表示,则会发生InexactError错误。例如:

julia> convert(Int, 1.0)
1

julia> convert(Int, 1.5)
ERROR: InexactError: Int64(1.5)

其他编程语言随意选择一种舍入方式(通常是截断,但有时也会四舍五入)。Julia 不会猜测,而要求您明确指定。如果您想进行舍入、截断、取上限等操作,可以:

julia> floor(Int, 1.5)
1

julia> round(Int, 1.5)
2

julia> ceil(Int, 1.5)
2

回到你的问题:你没有调用convert,那么为什么会出现转换错误?在各种情况下,Julia会自动为您调用convert函数,通常是当您尝试将值赋给类型化位置时。例如,如果你有一个Int数组,并且你将一个浮点数值赋值给它,它将被自动转换:

julia> v = [1, 2, 3]
3-element Array{Int64,1}:
 1
 2
 3

julia> v[2] = 4.0
4.0

julia> v
3-element Array{Int64,1}:
 1
 4
 3

julia> v[2] = 4.5
ERROR: InexactError: Int64(4.5)

所以这很可能是你遇到的问题:当你执行 (column .- min)/max 时,会得到非整数值,然后你尝试将它赋值到整数位置上,因此出现了错误。


注意 df[:, i] 列的存在;一个 MWE 可能是 julia> using DataFrames; df = DataFrame(a = rand(1:10, 10)); scaled_column = (df.a .- minimum(df.a)) / maximum(df.a); df[:, :a] = scaled_column - Nils Gudat
我不熟悉最近的数据框,我原以为 df[:, i] = values 会替换第 i 列而不是直接在原地赋值,但如果确实将其分配给现有列,那么是的,这会起作用。 - StefanKarpinski
在这种情况下,df [!,i]替换了该列,而df [:,i]则用新值替换了地方。为了将来的参考,当前的索引行为已记录在此处。 - Nils Gudat
df[:, i] 可以原地操作。在基础写法中,matrix[:, i] = vmatrix[:] = v 不会重新分配整个矩阵并更新绑定到 matrix 的内容。在这种情况下,: 只是一个行选择器,就像 axes(df, 1) 一样(因此 df[axes(df, 1), i] = value 是等效的)。! 选择器的引入正是因为它在基础中没有使用,因此可以遵循不同的规则。 - Bogumił Kamiński
同时想象一下,如果df是一个视图 - 那么很明显,df [:,i] = v不应该被允许替换列,而应该在原地工作。最后 - 如果df是一个DictNamedTuple,那么你可以写成df [i][:] = v作为等价的语法,我认为自然会期望在这种情况下操作是原地进行的。 - Bogumił Kamiński
@NilsGudat非常有用的评论,解决了我的问题。谢谢! - St Ax

1
作为一个额外的提示,你可以使用transform!来实现你想要的效果,像这样:
transform!(df, i => (x -> (x .- minimum(x)) ./ maximum(x)) => i)

并且这个操作将会替换该列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接