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

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

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

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

Q&A

解決済

1回答

4955閲覧

python 畳み込み演算 2次元

Tubasa1995

総合スコア83

Python

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

0グッド

0クリップ

投稿2018/12/20 08:44

編集2018/12/20 09:38

###現状
初心者なためコードが汚いかもしれませんがお許しください.
Python3でコードを作っています.
2次元の畳み込み演算をやろうと思い,まずよく分からないので1次元の畳み込み演算のコードを作ってみました.結果としては,欲しいものが出てきました.
ただ,本題は2次元の畳み込み演算なのですが...そこで躓いています.
どうコードを変えていけばいいのか...

前提・実現したいこと

この質問欄の一番下にこれから計算したい10行10列のデータがあります.形式はCSVファイルです.イメージ説明
イメージ説明
そのデータに関して
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
という平均化のフィルターをかけたいのですが,よく分かりません.
もちろん畳み込み演算なので平均化フィルターはスライスしていきます.

まず,データをどうやって行と列として読み込ませるのでしょうか.
そしてどうやって2次元の場合フィルターをスライスさせて全点に畳み込み演算ができますか.

ネットからサンプル画像に対してフィルターを書けるコードを拾ってきているのですが,それが画像ではない場合(つまりただの数値データのとき)はどうすれば良いのでしょうか.一応,画像にかけるフィルターのコードを一番下に乗せておきます.

お手数おかけするかもしれませんが,よろしくお願いします.

###現状の1次元の畳み込み演算のコード

Python3

1f=open('data.csv','r') 2x=f.readlines() 3f.close() 4 5peakpressure=[] 6num3=len(x) 7 8for i in range(num3): 9 peakpressure.append(float(x[i])) 10 11print("peakpressure") 12print(peakpressure) 13filtering = [0.33333,0.33333,0.33333] 14print("filtering") 15print(filtering) 16print('\n') 17num=len(filtering) 18num2=len(peakpressure) 19sum1=[] 20sum2=[] 21 22for l in range(num2-2): 23 for i in range(num): 24 a=peakpressure[l]*filtering[i] 25 print(a) 26 sum1.append(a) 27 l=l+1 28 print(sum1) 29 b=sum(sum1) 30 print(round(b,3)) 31 sum2.append(round(b,3)) 32 del sum1[:] 33 print('\n') 34print(sum2) 35 36f2=open('out.txt','w') 37for i in range(num2-2): 38 f2.write(str(sum2[i])) 39 f2.write('\n') 40f2.close()

出力結果

Python3

11.333 21.667 31.333 41.667 51.333 61.667 71.333 81.667

data.csv(1次元の時)

1 2 1 2 1 2 1 2 1 2

data.csv(2次元の時)

0 1 2 3 4 5 6 7 8 9 0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 3 2 1 2 1 2 1 2 1 2 1 4 1 2 1 2 1 2 1 2 1 2 5 2 1 2 1 2 1 2 1 2 1 6 1 2 1 2 1 2 1 2 1 2 7 2 1 2 1 2 1 2 1 2 1 8 1 2 1 2 1 2 1 2 1 2 9 2 1 2 1 2 1 2 1 2 1

画像のたたみこみ演算コード

from PIL import Image import numpy as np import sys filter = [0, 1, 0, 0, -2, 0, 0, 1, 0] def image_process(src): width, height = src.size dst = Image.new('RGB', (width, height)) img_pixels = np.array([[src.getpixel((x,y)) for y in range(height)] for x in range(width)]) color = np.zeros((len(filter), 3)) for y in range(1, height-1): for x in range(1, width-1): color[0] = img_pixels[x-1][y-1] color[1] = img_pixels[x-1][y] color[2] = img_pixels[x-1][y+1] color[3] = img_pixels[x][y-1] color[4] = img_pixels[x][y] color[5] = img_pixels[x][y+1] color[6] = img_pixels[x+1][y-1] color[7] = img_pixels[x+1][y] color[8]= img_pixels[x+1][y+1] sum_color = np.zeros(3) for num in range(len(filter)): sum_color += color[num] * filter[num] r,g,b = map(int, (sum_color)) r = min([r, 255]) r = max([r, 0]) g = min([g, 255]) g = max([g, 0]) b = min([b, 255]) b = max([b, 0]) dst.putpixel((x,y), (r,g,b)) return dst if __name__ == '__main__': param = sys.argv if (len(param) != 2): print ("Usage: $ python " + param[0] + " sample.jpg") quit() # open image file try: input_img = Image.open(param[1]) except: print ('faild to load %s' % param[1]) quit() if input_img is None: print ('faild to load %s' % param[1]) quit() output_img = image_process(input_img) output_img.save("filtered_" + param[1]) output_img.show()

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

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

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

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

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

tiitoi

2018/12/20 09:05

> データをどうやって行と列として読み込ませるのでしょうか. それはデータがどういう形式で保存されているかによります。 質問欄にその情報がないので、入力データのファイルの中身を追記できますか?
Tubasa1995

2018/12/20 09:11

失礼しました. 追記もしましたが, CSVファイルです.
tiitoi

2018/12/20 09:16 編集

CSV はカンマ区切りでn行m列でデータを記載する方式ですが、 記載いただいたファイルはインデックス?のようなものが入っており、データの列数が1行目だけ異なりますし、スペース4つで区切られているので、CSV形式ではないと思います。 これがそのままテキストファイルに記載されているのでしょうか?
Tubasa1995

2018/12/20 09:25

すいません,1列目と1行目は列番号と行番号です.すいません. エクセル時の写真をはりつけています.
tiitoi

2018/12/20 09:33

excel からコピーすると元データと異なってしまうので、元のcsvファイルをテキストエディタで開いて、それをコピペしてください
Tubasa1995

2018/12/20 09:37

失礼しました.これがEdit with Notepadで開いたもののコピペです. ,0,1,2,3,4,5,6,7,8,9 0,1,2,1,2,1,2,1,2,1,2 1,2,1,2,1,2,1,2,1,2,1 2,1,2,1,2,1,2,1,2,1,2 3,2,1,2,1,2,1,2,1,2,1 4,1,2,1,2,1,2,1,2,1,2 5,2,1,2,1,2,1,2,1,2,1 6,1,2,1,2,1,2,1,2,1,2 7,2,1,2,1,2,1,2,1,2,1 8,1,2,1,2,1,2,1,2,1,2 9,2,1,2,1,2,1,2,1,2,1
guest

回答1

0

ベストアンサー

numpy.loadtxt() を使うと読み込めます。
1行目1列目の番号は除くようにしています。

csv

1,0,1,2,3,4,5,6,7,8,9 20,1,2,1,2,1,2,1,2,1,2 31,2,1,2,1,2,1,2,1,2,1 42,1,2,1,2,1,2,1,2,1,2 53,2,1,2,1,2,1,2,1,2,1 64,1,2,1,2,1,2,1,2,1,2 75,2,1,2,1,2,1,2,1,2,1 86,1,2,1,2,1,2,1,2,1,2 97,2,1,2,1,2,1,2,1,2,1 108,1,2,1,2,1,2,1,2,1,2 119,2,1,2,1,2,1,2,1,2,1

python

1import numpy as np 2 3# skiprows=1: 1行目をスキップする。 4a = np.loadtxt('test.csv', skiprows=1, delimiter=',') 5a = a[:, 1:] # 1列目を除く。 6print(a.shape)

投稿2018/12/20 12:32

tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問