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

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

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

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

Q&A

解決済

4回答

161閲覧

Python 簡単な四則演算なのですが教えてください.

Tubasa1995

総合スコア83

Python

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

0グッド

0クリップ

投稿2018/12/20 05:21

前提・実現したいこと

Python3でコードを作っています.

今,リスト内に[1,2,3,4,5,6,7,8,9,10]という数値があります.
次に[1/3,2/3.1/3]という核リストをつくります.

プログラムを作って
11/3+22/3+31/3, 21/3+32/3+41/3, 31/3+42/3+5*1/3,....
というような計算をしたいと思っています.
つまり,最終アウトプットは
8/3,4,16/3,20/3,8,......12という出力ファイルを作りたいです.

初心者でなかなかよく分かりません.
とくに核リストを少しずつ横にずらしながら計算というものをどうやってコードで表現するのかわかりません.リストのデータを取得するところまではやったのですが,以降がよく分かりません.どなたか助けていただけませんか.

該当のソースコード

#data.txtは[1,2,3,4,5,6,7,8,9,10]というファイル f=open('data.txt','r') x=f.readline() f.close() k=[1/3,2/3,1/3] data=[] num=len(x) for i in range(num): data.append(flout(x[i])) print(data)

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

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

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

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

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

guest

回答4

0

ベストアンサー

畳込み演算でしょうか。

Python

1src = range(1, 11) 2kernel = [1/3, 2/3, 1/3] 3 4dst = [] 5for elems in zip(src, src[1:], src[2:]): 6 dst.append(0) 7 for e, k in zip(elems, kernel): 8 dst[-1] += e * k 9 10print(dst)

実行結果 Wandbox

[2.6666666666666665, 4.0, 5.333333333333333, 6.666666666666666, 7.999999999999999, 9.333333333333332, 10.666666666666666, 12.0]

zipの使い方、スライスの取り方がミソです。


つまり,最終アウトプットは

8/3,4,16/3,20/3,8,......12という出力ファイルを作りたいです.

分数を取り扱いたい場合は、fractionsモジュールの利用を検討します。

Python

1from fractions import Fraction 2 3src = range(1, 11) 4kernel = [ 5 Fraction(1, 3), Fraction(2, 3), Fraction(1, 3) 6] 7 8dst = [] 9for elems in zip(src, src[1:], src[2:]): 10 dst.append(0) 11 for e, k in zip(elems, kernel): 12 dst[-1] += e * k 13 14print(*dst, sep=',')

実行結果 Wandbox

8/3,4,16/3,20/3,8,28/3,32/3,12

おまけ

無駄に技量的に書くとこんな感じ。

Python

1from itertools import starmap 2from fractions import Fraction 3 4import operator as op 5 6 7src = range(1, 11) 8kernel = [ 9 Fraction(1, 3), Fraction(2, 3), Fraction(1, 3) 10] 11 12dst = [ 13 sum( 14 starmap(op.mul, zip(elems, kernel)) 15 ) 16 for elems 17 in zip(*( 18 src[off:] for off in range(len(kernel)) 19 )) 20] 21print(*dst, sep=',')

投稿2018/12/20 05:29

編集2018/12/20 05:39
LouiS0616

総合スコア35660

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

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

Tubasa1995

2018/12/20 08:47

解答ありがとうございます. まさに畳み込み演算をやっています. 1次元の畳込演算はみなさんのも参考にしながらですが,ある程度自力でどうにかできました.(コードはきれいでないですが) 次に2次元の場合の畳み込み演算をしたいのですが,もしよろしければ,また新たに質問を投稿していますので,お手伝いいただけませんか..
LouiS0616

2018/12/20 11:59

畳込みを担うライブラリを探した方が楽かと。 ざっと探してみた感じ、numpy.convolveが使えそうな気がします。
guest

0

あえて素直なコードで書いてみました。
なお、値は有理数として扱っています。

Python

1from fractions import Fraction 2 3data = [1,2,3,4,5,6,7,8,9,10] 4k = [Fraction(1,3), Fraction(2,3),Fraction(1,3)] # 有理数として構築 5data = [Fraction(d) for d in data] # 有理数に 6 7ret = [] 8for i in range(len(data)-2): # 0...7 9 r = 0 10 for j in range(len(k)): # 0...2 11 r += data[i] * k[j] 12 i += 1 13 ret.append(r) 14 15ret2 = [str(r) for r in ret] # 有理数を文字列に 16print(ret2) 17# ['8/3', '4', '16/3', '20/3', '8', '28/3', '32/3', '12'] 18 19ret2 = [float(r) for r in ret] # 有理数を実数に 20print(ret2) 21# [2.6666666666666665, 4.0, 5.333333333333333, 6.666666666666667, 8.0, 9.333333333333334, 10.666666666666666, 12.0]

投稿2018/12/20 05:58

can110

総合スコア38266

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

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

Tubasa1995

2018/12/20 09:29

解答ありがとうござます. シンプルで読みやすいコードで助かりました. これで無事1次元の場合のこの計算はできたのですが, 良ければ新たに質問を投稿していますが,これを2次元に拡張した場合についても 同様に一緒に考えていただけませんか.
guest

0

data.txt[1,2,3,4,5,6,7,8,9,10]って書いてあるなら、evalでも使って評価しないとリストには戻せませんし、他にも質問文のコードには変なところがある気がしますけど、それはそれとして。

要素をずらしながら3つずつ取り出すという操作は簡単なインデックスループとスライスで書けます。

python

1>>> lst = [1,2,3,4,5,6,7,8,9,10] 2>>> n = 3 3>>> for i in range(0, len(lst)-n+1): 4... print(lst[i:i+n]) 5... 6[1, 2, 3] 7[2, 3, 4] 8[3, 4, 5] 9[4, 5, 6] 10[5, 6, 7] 11[6, 7, 8] 12[7, 8, 9] 13[8, 9, 10]

投稿2018/12/20 05:28

hayataka2049

総合スコア30933

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

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

0

python

1out=[data[n]*k[0]+data[n+1]*k[1]+data[n+2]*k[2] for n in range(len(data)-len(k)+1)]

投稿2018/12/20 05:26

hiro-k

総合スコア902

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問