質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3802閲覧

Numpy:複数の座標を回転させたい

sakuramochi_py

総合スコア32

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/29 01:50

前提・実現したいこと

shape=(5, 4, 2)の二次元座標の配列の座標全てとの回転行列の内積をブロードキャストによって求めたい。

分からないこと

reshapeによりブロードキャスト可能にしようと思ったが、二次元座標の配列か回転行列をどのようにreshapeすればいいのか分からない

###コード

Python

1import numpy as np 2 3R = lambda rad: np.array([[np.cos(rad), -np.sin(rad)],[np.sin(rad), np.cos(rad)]]) 4a = np.random.randint(2, size=(5, 4, 2)) 5 6R(np.radians(90))@a

Traceback (most recent call last):
File "<stdin>", line 1, in <module>

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 4 is different from 2)

補足情報(FW/ツールのバージョンなど)

Python 3.9.2
Numpy 1.20.2
Windows 10

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

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

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

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

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

guest

回答2

0

ベストアンサー

最後の次元が回転させたいところですよね?
転置させた回転行列を右からかけてやればできないでしょうか。

python

1a @ R(np.radians(90)).T

回転行列はいわゆる縦ベクトルをかけるようになっているので、
回転させる座標が最初の次元にないといけないです。
aの次元を入れ替えてから回転行列とかけて、次元を戻せばいいのですが、
今回は一番最後が回転させたい座標なので、転置して右からかければ、
同様の計算をしていることになります。

投稿2021/05/29 02:31

編集2021/05/29 02:43
bsdfan

総合スコア4596

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

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

sakuramochi_py

2021/05/29 03:18

そうだったんですね。てっきり順番は関係ないのかと思ってました。 縦ベクトルをかけるのはNumpyの仕様ですか?
bsdfan

2021/05/29 03:27

縦ベクトルと書いたのは数学の話で、numpyには縦ベクトルというものは特にありません。それでイメージが湧けばと思って書いただけなので、数式の定義とやっている計算が理解できていれば、そこは無視してください。
sakuramochi_py

2021/05/29 03:36

分かりました。回答ありがとうございます!
guest

0

arrayの形を変えて計算するのはややこしそうなので、以下のようにapply_along_axisで指定した軸に沿って計算するのが確実かと思います。

Python

1import numpy as np 2 3R = lambda rad: np.array([[np.cos(rad), -np.sin(rad)],[np.sin(rad), np.cos(rad)]]) 4#a = np.random.randint(2, size=(5, 4, 2)) 5a = np.array([[[1,0],[0,1]],[[-1,0],[0,-1]]]) 6print(a.shape) # (2, 2, 2) 7 8def rot(v): 9 return R(np.radians(90))@v 10 11ret = np.apply_along_axis(rot, 2, a) 12print(ret) 13""" 14[[[ 6.123234e-17 1.000000e+00] 15 [-1.000000e+00 6.123234e-17]] 16 17 [[-6.123234e-17 -1.000000e+00] 18 [ 1.000000e+00 -6.123234e-17]]] 19"""

投稿2021/05/29 02:28

can110

総合スコア38278

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

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

sakuramochi_py

2021/05/29 03:15

なるほど! こちらの方が直感的にできていいですね! 活用させてもらいます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問