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

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

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

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

Python

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

Q&A

4回答

1397閲覧

ある範囲に含まれる数値が何個あるか数えるプログラミング

sd_program

総合スコア12

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/01/27 15:50

編集2022/01/27 19:37

前提・実現したいこと

一定の範囲に含まれる数値は何個,また別の範囲に含まれる数値は何個といったような個数を数えるプログラミングを作りたいです.

例えばリスト型のzに
z = [1.2 , -3.1 , 2.345, -3.9 , 3.9, 0.3 ]
といったような数値が入っており

s = [-4,-3,-2,-1,0,1,2,3,4]
があるとしたら

zの値は
-4<z<-3の数値は何個
-3<z<-2の数値は何個
...
3<z<4の数値は何個

でその個数を順番にリストに格納していくといったことができるようにしたいです.
zにはランダムで,範囲sは例のように順番に格納されています.

なのでこの例の場合だと答えをaとすると
a = [2 , 0 , 0, 0, 1, 1, 1, 1 ]となるような感じです.

zの数値は全部sの範囲内であり,-4<z<4です.
forで回して,個数をlenで調べていけばよさそうですが手段が思いつきません.

sの範囲は,決めたLの半分に+-を付けたものを最小値&最大値にしたいです.
なので今回の例ではL=8,n=8なので-4<-3,-3<-2の範囲ですが

もしL=30,n=60だったら
-15 < z < -14.5
...
14.5< z < 15
のそれぞれの範囲にある数値が何個あるか計算できるようにしたいです.
何卒宜しくお願い致します.

該当のソースコード

Python3

1L = 8 2n = 8 3z = [1.2 , -3.1 , 2.345, -3.9 , 3.9, 0.3 ] 4n = int(L/n) 5min = int(-L/2) 6max = int(L/2) 7s = list(range(min,max+1,n)) 8print(s) 9>>>[-4, -3, -2, -1, 0, 1, 2, 3, 4] 10 11

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

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

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

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

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

guest

回答4

0

L と n から s を作るんだったら、
s は作らずに L と n を使うだけでいいのではありませんか?

Python

1L = 8 2n = 8 3z = [1.2 , -3.1 , 2.345, -3.9 , 3.9, 0.3 ] 4 5m = -L / 2 6w = L / n 7a = [0] * n 8for v in z: 9 a[int((v - m) / w)] += 1 10print(a) 11 12# [2, 0, 0, 0, 1, 1, 1, 1]

-3.1 と -3.9 は -4 と -3 の間だから a[0] は 2 ですよね。
それからこのコードでは -4 < z < -3 ではなく -4 <= z < -3 になっています。
境界値と等しいものを除外したければ少し修正が必要です。

投稿2022/01/27 18:28

kazuma-s

総合スコア8224

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

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

sd_program

2022/01/27 18:45

ありがとうございます. このコードですと,もしL=30, n=10 とかにしたら 範囲は-15<= z < -12 -12<= z < -9 ... 12<= z < 15 といった形に必然的に応用可能ですよね?
sd_program

2022/01/27 19:11

あともう一つ, 申し訳ありません,zを実際に行いたい数値に変更して行ったところ nがLより大きく,つまりn>Lとなった時 ZeroDivisionError: float division by zero が出ました.どう対処するのがよろしいでしょうか?
kazuma-s

2022/01/28 03:15

ZeroDivisionError: float division by zero が出た時の z、n、L の値を具体的に書いてください。
sd_program

2022/01/28 09:14

zは-L/2< z L/2 の範囲内で大量にあります. nは50に,Lは30で行いました.
kazuma-s

2022/01/29 04:12

大量とは具体的にいくつですか? 半分にしてもエラーになりますか? どんどん半分にして、エラーになる最小限のデータの個数はいくつで実際の値は何ですか? また、a[int((v - m) / w)] += 1 の前に print(v) を入れて、エラーになる時の v の値を示してください。
guest

0

一番短く書けるのはpandasを使うことでしょう。
一行でも書けますが二行で書く方が良いと思います。
pandasのcut, qcut関数でビニング処理(ビン分割)pandas.DataFrameをGroupByでグルーピングし統計量を算出を組み合わせるだけです。

ただ、ビニングするときに、right=Trueにしてもright=Falseにしても、[1 , 0 , 1, 0, 1, 1, 1, 1 ]にはなりませんでした。数え間違えていませんか?

right=Trueの場合の結果

python

1>>> print(result) 2(-4, -3] 2 3(-3, -2] 0 4(-2, -1] 0 5(-1, 0] 0 6(0, 1] 1 7(1, 2] 1 8(2, 3] 1 9(3, 4] 1 10dtype: int64 11>>> print(list(result)) 12[2, 0, 0, 0, 1, 1, 1, 1]

right=Falseの場合の結果

python

1>>> print(result) 2[-4, -3) 1 3[-3, -2) 1 4[-2, -1) 0 5[-1, 0) 0 6[0, 1) 1 7[1, 2) 1 8[2, 3) 1 9[3, 4) 1 10dtype: int64 11>>> print(list(result)) 12[1, 1, 0, 0, 1, 1, 1, 1]

投稿2022/01/27 16:45

ppaul

総合スコア24666

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

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

sd_program

2022/01/27 16:50

ありがとうございます. 確認してみたところ,数え間違えていました. pandaは使ったことがないのでおおまかなコードを見せていただけないでしょうか? お手数をおかけしますがよろしくお願いします.
sd_program

2022/01/27 17:38

s_cut=pd.cut(z,s) print(s_cut) >>> [(1, 2], (-4, -3], (2, 3], (-4, -3], (3, 4], (0, 1]] Categories (8, interval[int64, right]): [(-4, -3] < (-3, -2] < (-2, -1] < (-1, 0] < (0, 1] < (1, 2] < (2, 3] < (3, 4]] これで恐らく範囲ごとに分けられていますよね?ここから範囲内にいくつあるのかを抜き出す方法が分かりません...
guest

0

np.histogram()関数を使うと数えることができます。
numpy.histogram — NumPy v1.22 Manual

python

1import numpy as np 2 3z = [1.2 , -3.1 , 2.345, -3.9 , 3.9, 0.3 ] 4s = [-4,-3,-2,-1,0,1,2,3,4] 5 6a = np.histogram(z, s)[0] 7print(a) 8# [2 0 0 0 1 1 1 1]

投稿2022/01/28 04:13

kirara0048

総合スコア1399

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

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

0

z と s とから求めるのであれば

Python

1z = [1.2 , -3.1 , 2.345, -3.9 , 3.9, 0.3 ] 2s = [-4, -3, -2, -1, 0, 1, 2, 3, 4] 3ans = [len([v for v in z if a < v < b]) for a,b in zip(s, s[1:])] 4print(ans) # [2, 0, 0, 0, 1, 1, 1, 1]

投稿2022/01/28 04:13

lehshell

総合スコア1147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問