这是我试过的

use ndarray::{arr2, s};
let mut a = arr2(&[[1, 2, 3],
                   [4, 5, 6]]);
let b = arr2(&[[2, 3, 3],
               [5, 6, 6]]);

a.slice_mut(s![.., ..2]).assign(&a.slice_mut(s![.., 1..]));

这显然是因为借款规则而失败的(playround link):
error[E0499]: cannot borrow `a` as mutable more than once at a time
  --> src/main.rs:13:38
   |
13 |     a.slice_mut(s![.., ..2]).assign(&a.slice_mut(s![.., 1..]));
   |     -                        ------  ^ second mutable borrow occurs here
   |     |                        |
   |     |                        first borrow later used by call
   |     first mutable borrow occurs here

这里a是我拥有的,b是我想要得到的。
在numpy中,这和a[:, :2] = a[:, 1:]一样简单。
PS也许有一个简单的解决办法?

最佳答案

在ndarray的master分支中有一个特殊的宏,它比split_at_mut()更方便,因为它支持任意切片-但是当切片重叠时它会惊慌失措:

use ndarray::multislice;
use ndarray::prelude::*;
let mut arr: Array1<_> = (0..4).collect();
let (mut a, mut b) = multislice!(arr, mut [..;2], mut [1..;2]);
a.assign(&b);

给出[1,1,3,3]
他们甚至解了一个丢番图方程来检验它。它发生在运行时,而不是编译时split_at_mut

关于multidimensional-array - 有没有一种好的方法可以在 rust 病的ndarray中进行重叠复制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57717133/

10-15 07:05