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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

304閲覧

ValueError: operands could not be broadcast together with shapes (100,) (2,)

Tyutohannpa_

総合スコア24

NumPy

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/05/13 02:42

編集2023/05/16 15:50

前提

ベジエ曲線を、美的曲線へ変換する手前で躓いてます。

該当のソースコード

def bezier_curve_derivative(Q, t): """ 制御点 Q とパラメーター t によって定義されるベジェ曲線の一次導関数を計算します。 """ n = len(Q) - 1 db_dt = np.zeros((len(t), len(Q[0]))) for i in range(n): db_dt += n * binom(n - 1, i) * (1 - t) ** ( n - 1 - i) * t ** i * np.subtract(Q[i + 1], Q[i]) return db_dt def binom(n, k): """ 二項係数を計算します (n は k を選択します)。 """ return math.comb(n, k) def bezier_to_Biteki(Q): """ 制御点Qで定義されるベジェ曲線を美しい曲線に変換します。 """ t = np.linspace(0, 1, 100) px, py = bezier_curve(Q) # Calculate rho and ds/drho dx_dt, dy_dt = bezier_curve_derivative(Q, t) rho = np.sqrt(px ** 2 + py ** 2) ds_drho = np.sqrt(dx_dt ** 2 + dy_dt ** 2) / rho # Calculate a and c a, c = miura_curvature(rho, ds_drho) # Calculate beautiful curve beautiful_rho = np.exp((a * np.log(rho)) + c) beautiful_x = px * beautiful_rho / rho beautiful_y = py * beautiful_rho / rho return np.array([beautiful_x, beautiful_y]).T

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

エラーメッセージ Traceback (most recent call last): File "C:/Users/phanton/PycharmProjects/pythonProject1/kyokusen/t2.py", line 23, in <module> beautiful_x, beautiful_y = bz.bezier_to_Biteki(Q) File "C:\Users\phanton\PycharmProjects\pythonProject1\kyokusen\t2_1.py", line 70, in bezier_to_Biteki dx_dt, dy_dt = bezier_curve_derivative(Q, t) File "C:\Users\phanton\PycharmProjects\pythonProject1\kyokusen\t2_1.py", line 41, in bezier_curve_derivative db_dt += n * binom(n - 1, i) * (1 - t) ** ( ValueError: operands could not be broadcast together with shapes (100,) (2,)

試したこと

チャットGPTにエラーについて聞き、二つの配列の形状が合わないことは理解し、修正点も聞いてみたのですが、何も修正されていないコードが返されてしまいました。
また、以下URLより、調べてもみたのですがネットからも調べてみたのですが、どう変えていいかわからづじまい。
https://www.delftstack.com/ja/howto/python/python-operands-could-not-be-broadcast-together-with-shapes/
上記のエラーについて助言いただけると幸いです。

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

python 3.8

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

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

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

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

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

meg_

2023/05/13 03:01

> bezier_curve_derivative(Q, t) 上記の引数 Q, t はどのような型(配列の場合は次元)を想定されていますか?
Tyutohannpa_

2023/05/13 03:11

質問ありがとうございます。 二次元の配列で返したいと思っています
meg_

2023/05/13 04:23

> 二次元の配列で返したいと思っています 戻り値の話ではなく引数について質問しています。
Tyutohannpa_

2023/05/13 05:48

すみません、Qは二次元で、tは一次元です。
meg_

2023/05/13 06:02

> Qは二次元で、tは一次元です。 両方ともnumpy.ndarrayですか?
Tyutohannpa_

2023/05/13 06:05

>両方ともnumpy.ndarrayですか? Qはnumpy.ndarray、tはnumpy.linspaceです。
meg_

2023/05/13 07:32

> Qはnumpy.ndarray、tはnumpy.linspaceです。 え?「tはnumpy.linspace」は本当ですか?これのことですか?https://numpy.org/doc/stable/reference/generated/numpy.linspace.html numpy.ndarrayではなくて関数ですか?そうなると len(t) のところでエラーになるはずなのでちょっと分からないです。
melian

2023/05/13 08:12

ソースコード上では t = np.linspace(0, 1, 100) となっているので t は numpy.ndarray でしょう。
meg_

2023/05/13 08:15

あと、binomとは何でしょうか?
melian

2023/05/13 10:10

binom() を取り除いて実行してみると同じエラーが発生します。  db_dt += n * (1-t)**(n-1-i) * t**i * np.subtract(Q[i+1], Q[i])  ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~ ValueError: operands could not be broadcast together with shapes (100,) (2,) n * (1-t)**(n-1-i) * t**i の shape は、t の shape が (100,) で n と i はスカラーなので (100,) になります。また、Q の shape が (2, n+1)なので、np.subtract(Q[i+1], Q[i]) の shape は (2,) になります。したがって、 n * binom(n - 1, i) * (1 - t) ** (n - 1 - i) * t ** i * np.subtract(Q[i + 1], Q[i]) の式には何らかの誤りがある、ということになるのでしょう。
Tyutohannpa_

2023/05/16 05:06

>あと、binomとは何でしょうか? 二項係数計算に使う関数です。入れるのを忘れていました。修正します。
meg_

2023/05/16 05:24

> db_dt += n * binom(n - 1, i) * (1 - t) ** ( n - 1 - i) * t ** i * np.subtract(Q[i + 1], Q[i]) 上記の各変数の形状(行列?スカラー? 行列の場合の行列数)を確認して、どの計算に問題があるのか確認するのが良いかと思います。
guest

回答1

0

自己解決

計算方法に誤りがあるということで、ベジエ曲線の生成からやり直しました。

Bernstein多項式を計算する関数

def bernstein(n, t):
B = []
for k in range(n + 1):
# 二項係数を計算してからBernstein多項式を計算
nCk = math.factorial(n) / (
math.factorial(k) * math.factorial(n - k))
B.append(nCk * t ** k * (1 - t) ** (n - k))
# print(nCk, k, n - k)
return B

こちらの関数を用いて計算を行い、とりあえずはベジエ曲線を描ける計算式になったので自己解決として終了させていただきます。

投稿2023/05/16 06:50

Tyutohannpa_

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問