我在Rust中使用smartcore库。尝试从DenseMatrix中删除最后一列。我想过创建一个具有正确列和行的单位矩阵,但并没有真正弄明白如何做到这一点。
use smartcore::linalg::naive::dense_matrix::DenseMatrix;use smartcore::linalg::BaseMatrix;fn main(){ let rows = 20 let cols = 20 let id_matrix = DenseMatrix::ones(rows, cols-1); //??}
回答:
你可以这样做来从数组中删除一些项目(行和列),然后创建DenseMatrix。
// DenseMatrix defenitionuse smartcore::linalg::naive::dense_matrix::*;// KNNClassifieruse smartcore::neighbors::knn_classifier::*;fn main() { // Turn Rust vectors with samples into a matrix let arr = [[1., 2.], [3., 4.], [5., 6.], [7., 8.], [9., 10.]]; let arr_slice: Vec<&[_]> = arr .iter() .enumerate() .filter(|&(i, _)| i < 4) // 考虑行0到3 .inspect(|x| println!("item {:?}", x)) // 调试后注释掉 .map(|(_,v)| v.as_ref()) .collect(); let x = DenseMatrix::from_2d_array(&arr_slice); let y = vec![2., 2., 2., 3.]; // Train classifier let knn = KNNClassifier::fit(&x, &y, Default::default()).unwrap(); // Predict classes let result = knn.predict(&x).unwrap(); println!("{:?}", result);}
结果如下:
item (0, [1.0, 2.0])item (1, [3.0, 4.0])item (2, [5.0, 6.0])item (3, [7.0, 8.0])[2.0, 2.0, 2.0, 2.0]
这个方法是将数组[[_]]
转换为切片&[&[_]]
。通过枚举器我可以获取行的索引,所以我只需过滤它即可。检查方法可以在你对结果满意时最后注释掉。
现在你需要删除最后一列,你可以在每行上使用切片[..2]
,如下所示:
fn main() { // Turn Rust vectors with samples into a matrix let arr = [[1., 2., 9.], [3., 4., 9.], [5., 6., 9.], [7., 8., 9.], [9., 10., 9.]]; let arr_slice: Vec<&[_]> = arr .iter() .enumerate() .filter(|&(i, _)| i < 4) // 考虑行0到3 .inspect(|x| println!("item {:?}", x)) // 调试后注释掉 .map(|(_,v)| v[..2].as_ref()) // 考虑列0到1 .inspect(|x| println!("item now {:?}", x)) // 调试后注释掉 .collect(); let x = DenseMatrix::from_2d_array(&arr_slice); let y = vec![2., 2., 2., 3.]; // Train classifier let knn = KNNClassifier::fit(&x, &y, Default::default()).unwrap(); // Predict classes println!("{:?}", knn.predict(&x).unwrap());}
结果如下:
item (0, [1.0, 2.0, 9.0])item now [1.0, 2.0]item (1, [3.0, 4.0, 9.0])item now [3.0, 4.0]item (2, [5.0, 6.0, 9.0])item now [5.0, 6.0]item (3, [7.0, 8.0, 9.0])item now [7.0, 8.0][2.0, 2.0, 2.0, 2.0]