🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

1618閲覧

Rust ndarray arrayの任意の要素を用いて行列計算を行いたい

BoKuToTuZenU

総合スコア51

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2021/03/08 10:23

前提・実現したいこと

rust_ndarrayを用いて、Array2の任意の場所の要素で全体のArrayを引き算したいと考えております。
pythonでは、

python

1a = np.array([[1.,1.,], [3.,4.,], [4.,4.,]]) 2new_a = a - a[0] 3// new_a => np.array([[0.,0.,], [2.,3.,],[3.,3.,]])

のような計算を行いたいと考えております。

発生している問題・エラーメッセージ

error[E0277]: the trait bound `ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>: ScalarOperand` is not satisfied --> src/features.rs:17:15 | 17 | let c = c - c.slice(s![idx, ..]); | ^ the trait `ScalarOperand` is not implemented for `ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>` | = note: required because of the requirements on the impl of `Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>` for `&ArrayBase<OwnedRepr<f64>, Dim<[usize; 2]>>` error[E0277]: the trait bound `ViewRepr<&f64>: DataOwned` is not satisfied --> src/features.rs:17:15 | 17 | let c = c - c.slice(s![idx, ..]); | ^ the trait `DataOwned` is not implemented for `ViewRepr<&f64>` | = note: required because of the requirements on the impl of `Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>` for `f64` = note: required because of the requirements on the impl of `Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>` for `&ArrayBase<OwnedRepr<f64>, Dim<[usize; 2]>>` error[E0277]: the trait bound `ViewRepr<&f64>: DataMut` is not satisfied --> src/features.rs:17:15 | 17 | let c = c - c.slice(s![idx, ..]); | ^ the trait `DataMut` is not implemented for `ViewRepr<&f64>` | = help: the following implementations were found: <ViewRepr<&'a mut A> as DataMut> = note: required because of the requirements on the impl of `Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>` for `f64` = note: required because of the requirements on the impl of `Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>` for `&ArrayBase<OwnedRepr<f64>, Dim<[usize; 2]>>` error: aborting due to 4 previous errors; 1 warning emitted error[E0271]: type mismatch resolving `<f64 as Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>>::Output == f64` --> src/features.rs:17:15 | 17 | let c = c - c.slice(s![idx, ..]); | ^ expected struct `ArrayBase`, found `f64` | = note: expected struct `ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>` found type `f64` = note: required because of the requirements on the impl of `Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>` for `&ArrayBase<OwnedRepr<f64>, Dim<[usize; 2]>>` error[E0271]: type mismatch resolving `<f64 as Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>>::Output == f64` --> src/features.rs:17:15 | 17 | let c = c - c.slice(s![idx, ..]); | ^ expected struct `ArrayBase`, found `f64` | = note: expected struct `ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>` found type `f64` = note: required because of the requirements on the impl of `Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>` for `&ArrayBase<OwnedRepr<f64>, Dim<[usize; 2]>>` error[E0277]: the trait bound `ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>: ScalarOperand` is not satisfied --> src/features.rs:17:15 | 17 | let c = c - c.slice(s![idx, ..]); | ^ the trait `ScalarOperand` is not implemented for `ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>` | = note: required because of the requirements on the impl of `Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>` for `&ArrayBase<OwnedRepr<f64>, Dim<[usize; 2]>>` error[E0277]: the trait bound `ViewRepr<&f64>: DataOwned` is not satisfied --> src/features.rs:17:15 | 17 | let c = c - c.slice(s![idx, ..]); | ^ the trait `DataOwned` is not implemented for `ViewRepr<&f64>` | = note: required because of the requirements on the impl of `Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>` for `f64` = note: required because of the requirements on the impl of `Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>` for `&ArrayBase<OwnedRepr<f64>, Dim<[usize; 2]>>` error[E0277]: the trait bound `ViewRepr<&f64>: DataMut` is not satisfied --> src/features.rs:17:15 | 17 | let c = c - c.slice(s![idx, ..]); | ^ the trait `DataMut` is not implemented for `ViewRepr<&f64>` | = help: the following implementations were found: <ViewRepr<&'a mut A> as DataMut> = note: required because of the requirements on the impl of `Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>` for `f64` = note: required because of the requirements on the impl of `Sub<ArrayBase<ViewRepr<&f64>, Dim<[usize; 1]>>>` for `&ArrayBase<OwnedRepr<f64>, Dim<[usize; 2]>>` error: aborting due to 4 previous errors; 1 warning emitted Some errors have detailed explanations: E0271, E0277. For more information about an error, try `rustc --explain E0271`.

該当のソースコード

rust

1// c: &Array2<f64> 2 3let c = c - c.slice(s![idx,..]);

できれば、cなどをclone()せずに行いたいと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のような感じでいかがですか。ひょっとしたら内部で clone しているかもしれません(未確認)。

rust

1extern crate ndarray; // 0.14.0 2use ndarray::prelude::*; 3 4fn main() { 5 let c: Array2<f64> = arr2(&[[1f64, 1f64], [3f64, 4f64], [4f64, 4f64]]); 6 let axis: usize = 0usize; 7 let idx: usize = 1usize; 8 let c_new: Array2<f64> = &c - &c.index_axis(Axis(axis), idx).insert_axis(Axis(axis)); 9 println!("{:?}", c_new); 10}

以下、ちょっとした説明です。

  • index_axis(&self, axis: Axis, index: usize) -> ArrayViewaxis に沿って index 番目の要素のビューを返します(Numpy での a[:, index] のような動作)。
  • insert_axis(axis: Axis) -> ArrayBaseaxis に相当する軸を追加します(Numpy での a[:, None] のような動作)。

参考:

投稿2021/03/08 15:41

Surpris

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問