删除数组中的值并减小其大小

时间:2018-05-24 15:08:56

标签: arrays julia

我有一个填充了一些值的数组。运行此代码后:

array = zeros(10)

for i in 1:10
   array[i] = 2*i + 3
end

数组看起来像:

10-element Array{Float64,1}:
  5.0
  7.0
  9.0
 11.0
 13.0
 15.0
 17.0
 19.0
 21.0
 23.0

我想通过删除第三个值来获取以下数组:

9-element Array{Float64,1}:
      5.0
      7.0
     11.0
     13.0
     15.0
     17.0
     19.0
     21.0
     23.0

怎么做?

修改

如果我有一个数组(而不是矢量),就像这里:

a = [1 2 3 4 5]

1×5 Array{Int64,2}:
 1  2  3  4  5

提议的deleteat!无效:

a = deleteat!([1 2 3 4 5], 1)

ERROR: MethodError: no method matching deleteat!(::Array{Int64,2}, ::Int64)

You might have used a 2d row vector where a 1d column vector was required.
Note the difference between 1d column vector [1,2,3] and 2d row vector [1 2 3].
You can convert to a column vector with the vec() function.
Closest candidates are:
  deleteat!(::Array{T,1} where T, ::Integer) at array.jl:875
  deleteat!(::Array{T,1} where T, ::Any) at array.jl:913
  deleteat!(::BitArray{1}, ::Integer) at bitarray.jl:961

我不想要列矢量。我想要:

1×4 Array{Int64,2}:
 2  3  4  5

有可能吗?

2 个答案:

答案 0 :(得分:3)

为了清楚说明:Julia中的Vector{T}只是Array{T, 1}的同义词,除非您正在谈论其他内容......我们会调用所有排名数组的Array个。

但这似乎是一个Matlab继承的误解。在Julia中,您通过在文字中使用空格来构造Matrix{T},即Array{T, 2}

julia> a = [1 2 3 4 5]
1×5 Array{Int64,2}:
 1  2  3  4  5

从矩阵中删除一般没有意义,因为你不能在矩形布局中轻松“修复形状”。

可以使用逗号编写VectorArray{T, 1}

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

就此而言,deleteat!有效:

julia> deleteat!(a, 1)
4-element Array{Int64,1}:
 2
 3
 4
 5

为了完整性,还有第三个变体RowVector,它是换位的结果:

julia> a'
1×4 RowVector{Int64,Array{Int64,1}}:
 2  3  4  5

从此你也无法删除。

答案 1 :(得分:1)

Deleteat!仅定义为:

完全实施:

Vector (a.k.a. 1-dimensional Array)
BitVector (a.k.a. 1-dimensional BitArray)

行向量(2维度)无法正常工作。 但是......这个技巧有一个解决方法:

julia> deleteat!(a[1,:], 1)'   # mind the ' -> transposes it back to a row vector. 

1×4 RowVector{Int64,Array{Int64,1}}:
 2  3  4  5

当然,对于包含2行或更多行的数组,这不起作用。