【问题标题】:How do I change the data type of a Julia array from "Any" to "Float64"?如何将 Julia 数组的数据类型从“Any”更改为“Float64”?
【发布时间】:2016-02-18 13:15:55
【问题描述】:

在 Julia 中是否有一个函数可以返回所需类型的数组副本,即等效于 numpys astype function?我有一个“任何”类型的数组,并且想将它转换为浮点数组。我试过了:

new_array = Float64(array)

但我收到以下错误

LoadError: MethodError: `convert` has no method matching 
convert(::Type{Float64}, ::Array{Any,2})
This may have arisen from a call to the constructor Float64(...),
since type constructors fall back to convert methods.
Closest candidates are:
  call{T}(::Type{T}, ::Any)
  convert(::Type{Float64}, !Matched::Int8)
  convert(::Type{Float64}, !Matched::Int16)
  ...
  while loading In[140], in expression starting on line 1

  in call at essentials.jl:56

我可以只编写一个函数来遍历数组并返回每个元素的浮点值,但是如果没有内置方法来执行此操作,我会觉得有点奇怪。

【问题讨论】:

  • 下面有几个答案似乎是正确的。你应该选择你认为最好的作为答案。

标签: arrays julia


【解决方案1】:

使用convert。注意我用于第一个数组的语法;如果你在创建数组之前就知道你想要什么,你可以在方括号前声明类型。 Any 可以很容易地替换为 Float64 并消除对 convert 函数的需求。

julia> a = Any[1.2, 3, 7]
3-element Array{Any,1}:
 1.2
 3  
 7  

julia> convert(Array{Float64,1}, a)
3-element Array{Float64,1}:
 1.2
 3.0
 7.0

【讨论】:

    【解决方案2】:

    也可以使用广播运算符.

    a = Any[1.2, 3, 7]
    Float64.(a)
    

    【讨论】:

    • 谢谢先生,我几乎失去了将通过 CSV.read 获得的数据帧从默认 Int64 转换为 Int16 的希望。出于某种原因,“类型”和“类型”关键字参数只是被忽略了,你总是得到 Int64 这对我有用 df = Int16.(CSV.read("file.csv"))
    【解决方案3】:

    你可以使用:

    new_array = Array{Float64}(array)

    【讨论】:

      【解决方案4】:

      Daniel 和 Randy 的回答很中肯,我将在这里添加另一种我喜欢的方式,因为它可以使更复杂的迭代案例相对简洁。话虽如此,它不如其他答案有效,后者更具体地与转换/类型声明相关。但是由于语法可以很容易地扩展到其他用例,所以值得添加:

      a = Array{Any,1}(rand(1000))
      f = [float(a[i]) for i = 1:size(a,1)]
      

      【讨论】:

      • 我在转换直接从 CSV 读取的字符串条目以获取值 't4new = [parse(t4[i]) for i=1:length(t4)]` 时使用了这种方法。这给了我所需的 int 值数组,正如您所期望的那样,您的使用是可扩展的。
      猜你喜欢
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2020-12-31
      • 1970-01-01
      相关资源
      最近更新 更多