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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Python

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

Q&A

解決済

3回答

1557閲覧

for文やwhile文を使わずにPythonでy=xより大きい部分と,中心が原点で半径が1の円の内側で重なる部分の面積を求めたいです.

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/12/23 04:56

試してみたコード

Python

1import numpy as np 2size = 10000 3 4if y - x > 0: 5 x = np.random.uniform(-1, 1, size) 6 y = np.random.uniform(-1, 1, size) 7area = x**2 + y**2 8print(4*len(area[area < 1])/size)

上のようなコードで求めようとしたのですがどうしてもy=xより大きいというのを表現できません.

エラーコードは

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

このようになり,any()やall()を使うと全く違った意味になってしまい困っています.

forとwhileを使わずに答えが求められるコードはどう書いたら良いのでしょうか?

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

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

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

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

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

y_waiwai

2018/12/23 05:04

なにかの課題でしょうか? そういうのは自分でやらないと意味がないように思います
ozwk

2018/12/23 05:11

半径1の円内とy>xの共通部分の面積って、それ半円の面積じゃないですかね。
退会済みユーザー

退会済みユーザー

2018/12/23 05:44

手計算で求めるのは簡単ですがPythonでやろうとすると上手く行かずに困っています.
pepperleaf

2018/12/23 05:55

Pythonで、言うよりは、乱数を使って求めたいという事? 面積だけならば、半円の計算式をPythonで表現するだけですね。 でもそれは求める答えではない、、、と。
退会済みユーザー

退会済みユーザー

2018/12/23 05:59 編集

その表現の方が正しいです. y=xより大きい部分の円というのをnumpyで発生させた乱数を用いて分類(?)させるのがまだ出来ずに困っています... ちなみにy_waiwaiさんへの解答ですが,課題はこれの3次元版で答えをそのまま聞くのはまずいと思い2次元で質問をしてそれを三次元で応用しようと思いました.わからない部分は尋ねるしか無いと思うので意味はあると思います.
Zuishin

2018/12/23 06:03

最近、モンテカルロ法で円の面積を求めたいと言う人がわけのわからないことを言って退会したような気がします。
退会済みユーザー

退会済みユーザー

2018/12/23 06:05

Zuishinさんが暇なのはわかるのですがお互い有益でないと思うので粘着するのはやめていただきたいです... せっかくの休日ですしお互い有意義に使いましょうよ...
Zuishin

2018/12/23 06:06

確信しました。
can110

2018/12/23 06:19

for文やwhile文を使ってはいけない理由と求めたい値の精度(円周は3でいいレベル?)を追記ください。
Zuishin

2018/12/23 06:38 編集

内包表記使えという課題ですかね。それとも再帰か。太字なので好意的に読むとわかるそうで、下手にエスパーすると悪意があるとして絡まれます。
can110

2018/12/23 06:49

特に好意も悪意もないですが、質問(課題?)の意図がよく分かりませんね…
guest

回答3

0

ベストアンサー

質問のコードを見たところ、モンテカルロ法で面積を求めたいということでしょうか?

python

1import numpy as np 2import matplotlib.pyplot as plt 3 4size = 100000 5# x \in [-1, 1]^2 をランダムに生成 6x = np.random.uniform(-1, 1, (size, 2)) 7# 直線 y=x より上側 (y >= x) かつ円の内部 (ユークリッドノルム <= 1) の点のインデックス 8in_indices = (x[:, 1] >= x[:, 0]) & (np.linalg.norm(x, axis=1) <= 1) 9 10print('estimation', 2 * 2 * np.count_nonzero(in_indices) / size) 11print('correct', np.pi / 2) 12 13# 可視化 14plt.scatter(x[in_indices, 0], x[in_indices, 1], 1, color='r') 15plt.scatter(x[~in_indices, 0], x[~in_indices, 1], 1, color='b')

イメージ説明

サイズを増やすと π/2 に近づくことがわかるかと思います。

python

1import numpy as np 2import matplotlib.pyplot as plt 3 4areas = [] 5sizes = np.logspace(3, 6, 50, dtype=int) 6for size in sizes: 7 x = np.random.uniform(-1, 1, (size, 2)) 8 in_indices = (x[:, 1] >= x[:, 0]) & (np.linalg.norm(x, axis=1) <= 1) 9 10 area = 2 * 2 * np.count_nonzero(in_indices) / size 11 areas.append(area) 12 13plt.plot(sizes, areas) 14plt.hlines(np.pi / 2, sizes.min(), sizes.max()) 15plt.xscale('log')

引用テキスト

投稿2018/12/23 07:40

tiitoi

総合スコア21956

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

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

0

ソースを読む限り、Pythonについて全く理解されないまま、なんとなくプログラムを書かれているようです。
import numpy as np の文で何が起こるのか、 xyをPythonがどう扱うのか、質問者さんは理解されていますか。
また、for文やwhile文を使えない合理的な理由を他人に説明できますか。

まずは、入門書を読むなり、公式ドキュメントの チュートリアル をやってみるなりして、プログラミング言語がどういうものか理解されてから、実際の問題に取り組んでいくことをおすすめします。

投稿2018/12/23 07:18

morinatsu

総合スコア395

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

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

0

グラフを描いてみてください。ループなど必要ありません。暗算で求められます。

投稿2018/12/23 05:07

Zuishin

総合スコア28660

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

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

退会済みユーザー

退会済みユーザー

2018/12/23 05:44

流石に暗算で求められますが,Pythonでやりたいのです.自分でやってみても上手くいかず質問しています.
Zuishin

2018/12/23 05:45

暗算でできるなら Python でもできます。1 + 1 も表示できます。
退会済みユーザー

退会済みユーザー

2018/12/23 05:52

日頃の鬱憤を私にぶつけられても困るんですが...
Zuishin

2018/12/23 05:53

「スコップを使わずに椅子が欲しいです」と言われたら「買えば?」「借りれば?」「ノコギリとハンマーと釘で作れば?」「ドリルと木ねじとドライバーでもいいよ」など、たくさんの答えがあります。「なぜそうしたいのか」を他人にわかるよう説明する必要があるでしょう。
退会済みユーザー

退会済みユーザー

2018/12/23 05:55

小学生みたいなことを言われても... 太字にしてあるので好意的に解釈すればわかると思いますが...
Zuishin

2018/12/23 05:55

小学生レベルでは高すぎてわからないという意味ですか?
pepperleaf

2018/12/23 05:58

質問の修正依頼にも書きましたが、手計算でできるならば、それをそのまま、プログラムにするだけです。従って、半円の計算式をPythonで書くだけでですが、それは求める答えでは無いと思うのですが、質問文からは分かりません。
退会済みユーザー

退会済みユーザー

2018/12/23 06:02

まあ落ち着きましょう. コードを見ればわかると思った私にも落ち度がありますが,Zuishinさんも自分の時間があると思うので意地の悪い解答はやめていただきたいです(最初から私の意図がわからないのでここを具体的にしてほしいと言えばいいと思うので). pepperleafさんの返信のようにもう少し質問の仕方を洗練させたいと思います.
Zuishin

2018/12/23 06:09 編集

では洗練して書き直してください。どこがわからないというレベルではなく、完全に意味不明です。わたしだけでなく、複数の人がハテナマーク浮かべてるのがわかりませんか?
Zuishin

2018/12/23 13:08 編集

腹いせの低評価は小学生レベルより上でしょうか下でしょうか? 小学生レベルに上がっておめでとうと言えばいいのですか? では、いい休日を。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問