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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

1回答

1301閲覧

Numpyでの配列参照を範囲指定したい (Python3.7)

bullion

総合スコア11

NumPy

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/06/10 10:30

編集2019/06/11 02:37

前提・実現したいこと

初心者です。もともとNumpyを使わずに動いていたプログラムをNumpyを使って動かしたいです。
Numpy移行前は、二重のforループを使って、501個のデータが時間変化とともにどう変わっていくか、その変化を見るプログラムを作りました。
各時間ごとにデータを格納していきたいです。
501個のデータを配列として作り、forループを一つ減らそうとしたのですが、配列の参照が上手くいきません。

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

only integer scalar arrays can be converted to a scalar index

該当のソースコード

Python3.7

1Bet_A = 10 2Bet_B = 0.05 3dttime = 1000 4arr = np.zeros(501) 5arr[0] = 1 6arr = np.array([arr]) 7arr = arr.T 8def calcal(l1 , t1 , dtype = 'int'): 9 return -(1/Bet_A) * arr[l1 , t1] 10 - (1/Bet_B) * arr[l1 , t1] 11 + (1/Bet_B) * np.sum(car[0 : l1 , t1]) + car[l1 , t1] 12 13list_countup = np.arange(0 , 501 , 1 , dtype = 'int') 14 15for time1 in tqdm(range(dttime)): 16 ghost = np.array(calcal(list_countup , time1)) 17 ghost = np.array([ghost]) 18 ghost = ghost.T 19 arr = np.concatenate([arr , ghost] , 1) 20 21 22 23# 2019-06-11 追記 Numpy配列を使わないときの関数部分の処理 24def calcal(l1 , t1 , dtype = 'int'): 25 return -(1/Bet_A) * arr[l1][t1] 26 - (1/Bet_B) * arr[l1][t1] 27 + (1/Bet_B) * sum(car[0:l1][t1]) + car[l1][t1] 28 29def loop(): 30 for t1 in tqdm(range(dttime)): 31 ghost = [calcal(l1 , t1) for l1 in range(501)] 32 arr.append(ghost) 33 34loop() 35

試したこと

問題がある部分はnp.sum(car[0 : l1 , t1]))の部分だと思います。
試しに0 : l1の部分を 10とかの整数にしたら動きました。
list_countupを引数に使って範囲指定しています。この方法が良くないのだとは思うのですが、調べてみてもどうすればいいのかわかりません。

どうにもならないので二重forループで書き直してみたら、numpyを導入する前よりも遅くなってしまいました。

ご教授お願いいたします。

2019-06-11 追記
Bet_A, Bet_B, dttimeについて追記させていただきました。定数です。

動かないソースだけ貼っても「なにをしたかったのか」は伝わりません。だって「動かない」ソースですから。 遅くても動くソースの方があった方がずっと助けになりますよ。

おっしゃるとおりです。コードの最後に、一部追加します。
forループを使わないでnp.sum(numpy_list[ 0 : x , y])を計算したいです。xとyはそれぞれNumpy配列で0から任意の整数まで、+1ずつの配列になっています。
このままでは動かないので、代わりとなるような処理方法はないでしょうか。

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

実行環境 Python3.7
IDE Spyder

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

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

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

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

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

amahara_waya

2019/06/11 00:04

Bet_A,Bet_B,dttimeの定義についてコード中に追記くださると、コードを再現する際の参考になり助かります。
quickquip

2019/06/11 00:17 編集

エラーメッセージに書いてあるとおりの内容だと思うのですが読んでますか? 動かないソースだけ貼っても「なにをしたかったのか」は伝わりません。だって「動かない」ソースですから。 遅くても動くソースの方があった方がずっと助けになりますよ。
guest

回答1

0

ベストアンサー

計算したいのは累積和のようなので、以下の方法で計算できると思います。

python

1cumsum_car = np.cumsum(car, axis=0) - car 2 3# 編集前のバージョン、難しく考え過ぎました 4# cumsum_car = np.zeros_like(car) 5# cumsum_car[1:] = np.cumsum(car, axis=0)[:-1]

cumsum_car[x, y]が、np.sum(car[0:x, y])に等しくなっています。
なお、質問には任意のx, yとありますが、この場合はもとのcarのインデックスとして有効な値の範囲のみとなります。

calcalは以下のようになりますが、各arrayのshape次第ではもう少し簡単に出来ると思います。

python

1def calcal(l1, t1): 2 return (-(1/Bet_A) * arr[l1, t1] 3 - (1/Bet_B) * arr[l1, t1] 4 + (1/Bet_B) * cumsum_car[l1, t1] 5 + car[l1, t1])

投稿2019/06/11 09:42

編集2019/06/11 23:25
bsdfan

総合スコア4520

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

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

bullion

2019/06/13 02:50

ありがとうございます。 おかげさまでどうにかなりそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問