Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Julia,@view阻止生成新阵列_Arrays_Julia_Row Removal - Fatal编程技术网

Arrays Julia,@view阻止生成新阵列

Arrays Julia,@view阻止生成新阵列,arrays,julia,row-removal,Arrays,Julia,Row Removal,我的老朋友称为Pop的3d数组,我想在d1==1的末尾删除所有d3中的列(d2),因此我有以下代码: Pop[end, :, 1] .!=1 我认为在前面添加@view会将更改写回Pop,而不会在内存中生成额外的副本。这个代码很好用 @view(Pop[ :, Pop[end, :, 1] .!=1, :]) 但它并没有改变原来的3d数组Pop。我可以 Pop = @view(Pop[ :, Pop[end, :, 1] .!=1, :]) 但我相信这会在内存中创建另一个副本,我正试图避免

我的老朋友称为Pop的3d数组,我想在d1==1的末尾删除所有d3中的列(d2),因此我有以下代码:

Pop[end, :, 1] .!=1
我认为在前面添加
@view
会将更改写回Pop,而不会在内存中生成额外的副本。这个代码很好用

@view(Pop[ :, Pop[end, :, 1] .!=1, :])
但它并没有改变原来的3d数组Pop。我可以

Pop = @view(Pop[ :, Pop[end, :, 1] .!=1, :])

但我相信这会在内存中创建另一个副本,我正试图避免。我错过了什么简单的语法?谢谢。J

@view
不会修改原始数组的大小,它会在其中提供一个“视图”(例如,在您的案例中省略一些列)。我不认为这有什么问题

Pop = view(Pop, :, Pop[end, :, 1] .≠ 1, :)
由于现在的
Pop
是对旧的完整
Pop
的视图,但它的行为类似于一个数组,因此您可以修改其条目,例如,您可以执行以下操作

julia> using Random # using a fixed seed for reproducibility

julia> Random.seed!(0) ;

julia> Pop = rand(1:5, (2,4,2)) # original Pop
2×4×2 Array{Int64,3}:
[:, :, 1] =
 4  3  5  5
 1  1  3  5

[:, :, 2] =
 2  2  3  1
 2  5  1  1

julia> Pop[end,:,1] .≠ 1 # columns to keep
4-element BitArray{1}:
 0
 0
 1
 1

julia> Pop = view(Pop, :, Pop[end, :, 1] .≠ 1, :) # make it a view
2×2×2 view(::Array{Int64,3}, :, [3, 4], :) with eltype Int64:
[:, :, 1] =
 5  5
 3  5

[:, :, 2] =
 3  1
 1  1

julia> Pop[end,:,1] .= 1 ; # use your new view to manipulate data

julia> Pop # view of the modified Pop
2×2×2 view(::Array{Int64,3}, :, [3, 4], :) with eltype Int64:
[:, :, 1] =
 5  5
 1  1

[:, :, 2] =
 3  1
 1  1

julia> Pop.parent # original full Pop (now Pop.parent) has been modified
2×4×2 Array{Int64,3}:
[:, :, 1] =
 4  3  5  5
 1  1  1  1

[:, :, 2] =
 2  2  3  1
 2  5  1  1

AFAIK您不能“就地”从多维数组中删除列。请参阅