我是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"
我是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"
没有提供问题的最小工作示例,很难给出确切的答案。但一般来说,当您尝试将一个值转换为精确类型(如整数类型,但不像浮点类型)时,如果原始值无法精确表示,则会发生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 Gudatdf[:, i] = values
会替换第 i
列而不是直接在原地赋值,但如果确实将其分配给现有列,那么是的,这会起作用。 - StefanKarpinskidf [!,i]
替换了该列,而df [:,i]
则用新值替换了地方。为了将来的参考,当前的索引行为已记录在此处。 - Nils Gudatdf[:, i]
可以原地操作。在基础写法中,matrix[:, i] = v
或 matrix[:] = v
不会重新分配整个矩阵并更新绑定到 matrix
的内容。在这种情况下,:
只是一个行选择器,就像 axes(df, 1)
一样(因此 df[axes(df, 1), i] = value
是等效的)。!
选择器的引入正是因为它在基础中没有使用,因此可以遵循不同的规则。 - Bogumił Kamińskidf
是一个视图 - 那么很明显,df [:,i] = v
不应该被允许替换列,而应该在原地工作。最后 - 如果df
是一个Dict
或NamedTuple
,那么你可以写成df [i][:] = v
作为等价的语法,我认为自然会期望在这种情况下操作是原地进行的。 - Bogumił Kamińskitransform!
来实现你想要的效果,像这样:transform!(df, i => (x -> (x .- minimum(x)) ./ maximum(x)) => i)
并且这个操作将会替换该列。