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

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

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

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

Python 3.x

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

Q&A

解決済

3回答

6517閲覧

NumPyを使って多次元配列の平均を求めたい

k1225

総合スコア21

NumPy

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

Python 3.x

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

0グッド

0クリップ

投稿2020/04/25 15:10

編集2020/04/25 23:31

前提・実現したいこと

実現したいのは3x3配列の平均を求めることなのですが、以下のエラーが出ます。np.mean(),arr.mean()の両方試しましたが、同じでした。解決方法を教えていただけないでしょうか?
イメージ説明説明](bd8f2357a7dfb50b7e68e0b6b85cc5d1.png)

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

row.extend(np.mean(temp)) TypeError: 'numpy.float64' object is not iterable

該当のソースコード

python

1list = [[10,15,12,6,4],[10,12,11,6,6],[15,14,14,3,1],[3,5,2,3,5],[3,2,3,5,2]] 2numrows = 5 3numcols = 5 4ndarray = np.array(list) 5averagelist = [] 6 7averagelist.append(ndarray[0]) 8for i in range(1, numrows): 9 for j in range(numcols): 10 row = [] 11 if j == 0 or j == numcols - 1: 12 row.append(ndarray[i][j]) 13 else: 14 temp = np.array(ndarray[i-1:i+2,j-1:j+2]) 15 print(temp) 16 #row.extend(np.mean(temp)) 17 row.extend(temp.mean()) 18 averagelist.append(row) 19averagelist[numrows-1].append(ndarray[numrows-1]) 20 21print(averagelist)

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

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

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

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

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

meg_

2020/04/25 16:14

質問の配列の場合、求める結果は何になりますか?
guest

回答3

0

ベストアンサー

質問画像の処理は画像処理でそれぞれ平均フィルタ、メディアンフィルタと呼ばれるものです。
scipy などのライブラリにある実装を使うか、numpy で自分で実装してもよいです。

scipy を使う場合

どちらも scipy に関数があります。
平均フィルタは scipy.ndimage.convolve() で各要素が 1 / 9 であるカーネルでフィルタリングすると、計算できます。
メディアンフィルタは scipy.ndimage.median_filter() を使うと計算できます。

python

1from scipy import ndimage 2 3# 平均フィルタ 4kernel = np.full((3, 3), 1 / 9) 5mean = ndimage.convolve(a, kernel)[1:-1, 1:-1] # [1:-1, 1:-1] は padding 分を削っている 6print(mean) 7 8# メディアンフィルタ 9median = ndimage.median_filter(a, size=3)[1:-1, 1:-1] 10print(mean)

numpy を使った実装例

python

1a = np.array( 2 [ 3 [10, 15, 12, 6, 4], 4 [10, 12, 11, 6, 6], 5 [15, 14, 14, 3, 1], 6 [3, 5, 2, 3, 5], 7 [3, 2, 3, 5, 2], 8 ] 9) 10filter_size = (3, 3) 11 12# フィルタリング後の出力サイズはパディングなしの場合 13# (高さ - フィルタの高さ + 1, 幅 - フィルタの幅 + 1) 14out_h = a.shape[0] - filter_size[0] + 1 15out_w = a.shape[1] - filter_size[1] + 1 16 17output = np.empty((out_h, out_w), dtype=a.dtype) 18 19for i in range(a.shape[0] - 2): 20 for j in range(a.shape[1] - 2): 21 window = np.array(a[i : i + 3, j : j + 3]) 22 print(f"i = {i}, j = {j}\n", window) 23 output[i, j] = window.mean() 24 25print(output)

numpy の実装例を stride trick を使って書いた例

python

1import numpy as np 2 3a = np.array( 4 [ 5 [10, 15, 12, 6, 4], 6 [10, 12, 11, 6, 6], 7 [15, 14, 14, 3, 1], 8 [3, 5, 2, 3, 5], 9 [3, 2, 3, 5, 2], 10 ] 11) 12 13# フィルタをスライドさせたときに重なる各領域を表す配列を stride trick で作る 14filter_size = (3, 3) 15# フィルタリング後の出力サイズはパディングなしの場合 16# (高さ - フィルタの高さ + 1, 幅 - フィルタの幅 + 1) なので 17output_size = tuple(np.subtract(a.shape, filter_size) + 1) 18 19shape = output_size + filter_size 20strides = a.strides + a.strides 21view = np.lib.stride_tricks.as_strided(a, shape, strides) 22print(view) 23 24# メディアンフィルタ 25mean = np.median(view, axis=(2, 3)) 26print("メディアンフィルタ", mean.astype(int)) 27 28# 平均フィルタ 29median = np.mean(view, axis=(2, 3)) 30print("平均フィルタ", median.astype(int))
メディアンフィルタ [[12 12 6] [11 6 5] [ 3 3 3]] 平均フィルタ [[12 10 7] [ 9 7 5] [ 6 5 4]]

投稿2020/04/26 04:26

編集2020/04/26 04:42
tiitoi

総合スコア21956

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

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

0

期待する結果がわかりませんが、以下でいかがでしょうか。

data = [[10,15,12,6,4],[10,12,11,6,6],[15,14,14,3,1],[3,5,2,3,5],[3,2,3,5,2]] Mean_vec = np.mean(data,axis=0) ### array([8.2, 9.6, 8.4, 4.6, 3.6])

上記は縦軸方向に平均を計算しています。横軸方向であれば、axis=1としてください。

投稿2020/04/25 20:07

R.Shigemori

総合スコア3376

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

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

k1225

2020/04/25 23:34 編集

わかりづらくて申し訳ありません。しようとしていることは3x3のマスを移動させてそのマス全体の平均を求めて、averagelist中の真ん中のセルに追加することです。質問文に写真を追加しましt。
guest

0

row.append(temp.mean())ですか?

投稿2020/04/25 15:47

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問