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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

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

Q&A

解決済

1回答

1227閲覧

python-2Dマップのbinまとめ

mega_ne

総合スコア16

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/05/31 00:12

python

1 2data = np.genfromtxt('./A.txt', delimiter='') 3h = data[:,0] 4x = data[:,1] 5y = data[:,2] 6n = 1 #横軸・縦軸の刻み間隔 7 8X = np.arange(math.floor(np.min(x)), math.ceil(np.max(x)) + n/2, n) #最終的な横軸 9Y = np.arange(math.floor(np.min(y)), math.ceil(np.max(y)) + n/2, n) #最終的な縦軸 10 11H = [[h[k] for k in range(len(h)) if X[i] <= x[k] < X[i+1] and Y[j] <= y[k] < Y[j+1]] for i in range(len(X)-1) for j in range(len(Y)-1)] #あるX・Yに入るHをlistに入れる 12 13 14H2 = [sum(H[l]) for l in range(len(H))] 15H2 = np.array(H2).reshape(len(X)-1,-1) #mesh化 16X2,Y2 = np.meshgrid(X[0:len(X)],Y[0:len(Y)]) #mesh化 17 18fig = plt.figure(figsize=(10, 8)) 19ax = fig.add_subplot(111) 20 21plt.xlabel('X2') #" 22plt.ylabel('Y2') #" 23plt.xlim(0,6) #" 24plt.ylim(0,6) #" 25 26m = ax.pcolormesh(X2, Y2, H2.T, cmap='tab20',edgecolors='w') 27fig.colorbar(m, label='bar') 28 29plt.show()

各X2, Y2に対して1ずつ区切ったマスの中に入ったHを合計しました

上記のコードでpcolormeshより2Dマップを作成しました。データのX, Y, Hより、範囲1ずつのX, Yに入ったHをそれぞれ合計してマップを作成するコードです。データは以下に示します。hが高さでx, yがそれぞれ横軸、縦軸の値です。

h x y
1 0.1 0.4
2 2.1 0.9
3 4.5 4.9
4 3.8 5.6
5 5.8 0.8
6 0.8 4.4
7 2.2 0.1
8 1.8 3.4
9 4.5 1.9
10 4.2 4.1

次に、横・縦それぞれ2ずつ、合計4マスに入ったHの合計をさらに合計(binまとめ)したいです。そして最終的には3×3のマス目になったマップを作成したいのですが、pcolormeshでbinがなさそうなので、他に良い方法はないでしょうか?
引数であるのであれば、引数で指定できればと思います。ないのであれば、別の関数(?)を使って作成したいのですが、どのように作成すれば簡単になりますか?

また、pythonでこのコードを実行するとデータ量が多いとかなり時間がかかるのですが、forやifを多用する場合はpythonではなくて他の言語を使ったほうが早く処理できますか?
pythonしかやったことがないので、今の所はpythonで書いています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

numpyの行列加工機能には単純なものから若干複雑なものまでいろいろあります。その中で比較的単純な機能reshape(形の変形), transpose(軸の交換), sum(特定軸方向の累加)を組み合わせればbinningができると思います。

素朴な手順例を挙げますと、

(1) reshapeで6x6 -> 3x2x3x2にする
(2) transposeで1軸目と2軸目を交換し 3x2x3x2 -> 3x3x2x2にする
(3) sumにより2軸目および3軸目を累加する

python

1import numpy as np 2 3# 6 x 6 -> 3 x 3にbinning 4rows = cols = 6 5a66 = np.array(range(rows * cols)).reshape(rows, -1) 6print(a66) 7 8nrows, ncols = rows // 2, cols // 2 9a33 = a66.reshape(nrows, 2, ncols, 2).transpose(0, 2, 1, 3) \ 10 .sum(axis=(2, 3)) 11print(a33)

===>

[[ 0 1 2 3 4 5] [ 6 7 8 9 10 11] [12 13 14 15 16 17] [18 19 20 21 22 23] [24 25 26 27 28 29] [30 31 32 33 34 35]] [[ 14 22 30] [ 62 70 78] [110 118 126]]

ではありますが・・・

このカラーメッシュが6x6になるのはH2を生成する際に、x, yの最小、最大の差がどちらも6でそれを間隔1で生成したからです。

そうして生成した行列H2を前述した方法でbinningしてもよいですけど、そもそも最初から間隔を2にしてH2を生成すれば直接3x3にできますよ?

つまりnを2にするだけでご質問にあるコードそのままでお望みのH2が求まります。それでよい気もしますがいかがでしょう?

投稿2019/05/31 02:31

KSwordOfHaste

総合スコア18402

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

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

mega_ne

2019/05/31 03:10

確かにnを2にすればできますね... 関数などで解決しようとばかりしていました。 回答、指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問