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

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

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

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Python 3.x

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

Python

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

Q&A

解決済

1回答

355閲覧

一次元リスト&二次元リストの掛け算とΣの計算方法

退会済みユーザー

退会済みユーザー

総合スコア0

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/06/14 22:10

編集2022/06/15 02:42

2つ質問があります。
1つ目は、1次元リストと2次元リストの掛け算ができないです。

行ったこと

python

1import collections 2from collections import Counter 3from pkgutil import iter_importers 4from pprint import pprint 5 6data = [ 7["A", "B", "C", "D", "E", "E"], 8["C", "D", "E", "A", "B", "B"], 9["D", "C", "E", "A", "A", "D"], 10["D", "A", "C", "B", "D", "E"], 11] 12 13items_each_column = [] 14for c in zip(*data): 15 items_each_column.append(len(set(c))) 16print(items_each_column) 17 18 19frequency = [] 20 21for z in zip(*data): 22 frequency.append(z) 23 z_list = list(z) 24 nx = list(map(Counter,map(list, zip(*data)))) 25 26num = len(nx) 27 28 29num_2 = [] 30 31for i in range(num): 32 nj = [] 33 for j in ["A", "B", "C", "D", "E"]: 34 ni = nx[i][j] 35 if ni == 0: 36 continue 37 nj.append(ni) 38 num_2.append(nj) 39print(num_2) 40 41for x in range(len(items_each_column)): 42 for y in range(len(num_2)): 43 w = [1/k * n for (kx, nxi) in zip(items_each_column[x], num_2[x][y])] 44 print(w) 45 46#出力結果 47#[3, 4, 2, 3, 4, 3] ←print(items_each_column)の出力結果 48#[[1, 1, 2], [1, 1, 1, 1], [2, 2], [2, 1, 1], [1, 1, 1, 1], [1, 1, 2]] ←print(num_2)の出力結果 49Traceback (most recent call last): 50 File "c:/Users/RRR/MyPython/.py", line 46, in <module> 51 w = [1/k * n for (kx, nxi) in zip(items_each_column[x], num_2[x][y])] 52TypeError: 'int' object is not iterable

得たい結果
1つ目:[[1/3, 1/4, 1/4, 1/3, 1/4, 1/4],[1/3, 1/4, 1/4, 1/6, 1/4, 1/4],[1/6, 1/4, 1/4, 1/6, 1/4, 1/4],[1/6, 1/4, 1/4, 1/3, 1/4, 1/4]]
2つ目:[5/3, 3/2, 4/3, 3/2]

計算ルール
まず、items_each_columnではdataの○列の記号の種類数を列ごとにリストに格納しています。
それが、

python

1items_each_column = [] 2for c in zip(*data): 3 items_each_column.append(len(set(c))) 4print(items_each_column)

で示しています。
items_each_column = [3, 4, 2, 3, 4, 3]

次に、num_2は列に存在している記号の数を列ごとにリストに入れています。
それが、

python

1frequency = [] 2 3for z in zip(*data): 4 frequency.append(z) 5 z_list = list(z) 6 nx = list(map(Counter,map(list, zip(*data)))) 7 8num = len(nx) 9 10 11num_2 = [] 12 13for i in range(num): 14 nj = [] 15 for j in ["A", "B", "C", "D", "E"]: 16 ni = nx[i][j] 17 if ni == 0: 18 continue 19 nj.append(ni) 20 num_2.append(nj) 21print(num_2)

で示しています。
num_2 = [[1, 1, 2], [1, 1, 1, 1], [2, 2], [2, 1, 1], [1, 1, 1, 1], [1, 1, 2]]

kは変数です。
nは変数です。
wは空のリストです。

そして、
1/items_each_column[0]*num_2[0][0], 1/items_each_column[1]*num_2[1][0], 1/items_each_column[2]*num_2[2][0], 1/items_each_column[3]*num_2[3][0], 1/items_each_column[4]*num_2[4][0], 1/items_each_column[5]*num_2[5][0]を計算したらw[0]に格納します。
1/items_each_column[0]*num_2[0][1], 1/items_each_column[1]*num_2[1][1], 1/items_each_column[2]*num_2[2][0], 1/items_each_column[3]*num_2[3][0], 1/items_each_column[4]*num_2[4][1], 1/items_each_column[5]*num_2[5][1]を計算したらw[1]に格納します。
1/items_each_column[0]*num_2[0][2], 1/items_each_column[1]*num_2[1][2], 1/items_each_column[2]*num_2[2][1], 1/items_each_column[3]*num_2[3][1], 1/items_each_column[4]*num_2[4][2], 1/items_each_column[5]*num_2[5][2]を計算したらw[2]に格納します。
1/items_each_column[0]*num_2[0][2], 1/items_each_column[1]*num_2[1][3], 1/items_each_column[2]*num_2[2][1], 1/items_each_column[3]*num_2[3][2], 1/items_each_column[4]*num_2[4][3], 1/items_each_column[5]*num_2[5][2]を計算したらw[3]に格納します。

#1/items_each_column[0]×num_2[0][2]を2回計算しているのはdataの1列目にDが2つあるからです。
#1/items_each_column[2]×num_2[2][0]を2回計算しているのはdataの3列目にCが2つあるからです。
#1/items_each_column[2]×num_2[2][1]を2回計算しているのはdataの3列目にEが2つあるからです。
#1/items_each_column[3]×num_2[3][0]を2回計算しているのはdataの4列目にAが2つあるからです。
#1/items_each_column[5]×num_2[5][2]を2回計算しているのはdataの6列目にEが2つあるからです。

w[0]~w[3]を各リストごとに計算したら、
[[1/3, 1/4, 1/4, 1/3, 1/4, 1/4],[1/3, 1/4, 1/4, 1/6, 1/4, 1/4],[1/6, 1/4, 1/4, 1/6, 1/4, 1/4],[1/6, 1/4, 1/4, 1/3, 1/4, 1/4]]
となります。

質問が長くて申し訳ございません。

2つ目の質問です。
[[1/3, 1/4, 1/4, 1/3, 1/4, 1/4],[1/3, 1/4, 1/4, 1/6, 1/4, 1/4],[1/6, 1/4, 1/4, 1/6, 1/4, 1/4],[1/6, 1/4, 1/4, 1/3, 1/4, 1/4]]をリストごとに足したいです。
得たい結果
[5/3, 3/2, 4/3, 3/2]
手計算した結果なので分数で書きましたが恐らく割り算した値が出力されると思います。

質問が長くなってしまい申し訳ございません。よろしくお願いいたします。

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

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

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

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

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

can110

2022/06/15 00:50

全体的にどのような結果を得たいのかが理解できません。 結果を得るための計算ルール、方法を具体例を示したうえで記載ください。
退会済みユーザー

退会済みユーザー

2022/06/15 01:13

言葉足らずで申し訳ございません。 計算ルールについて追加しました。 どうかよろしくお願いいたします。
can110

2022/06/15 01:21

「1/[0]×[0][0]、1/[0]×[0][1]、1/[0]×[0][2]、1/[0]×[0][2]」 この中で[0]や[0][0]などは何を表していますか? またこれら4つの数値がwに入ってほしいということですか? k やnやwというものがどういった意味を持ち、どういった計算ルールでdataから?求めたものなのか? というところから説明をお願いします。
退会済みユーザー

退会済みユーザー

2022/06/15 02:48

度々申し訳ございません。k,n,wは私が指定したものだったので書いてることに間違いがありました。誤解を招くような文章弟子。ごめんなさい。訂正しました。 よろしくお願いいたします。
can110

2022/06/15 04:17

num_2がどのようなルールでできており、何を表しているのかが分かりません。 また、num_2[x][y]と記述したとき、w[1]の計算で、yが順に[1,1,0,0,1,1]をとるルール、 「~を~回計算しているのはdataの~列目に~が空つあるからです」という説明とどういった繋がりがあるのか?が理解できません。
退会済みユーザー

退会済みユーザー

2022/06/15 04:38

すいません、私の理解不足でnum_2がどのようなルールでできているかをどうやったら詳しく説明できるか分かりません。 num[x][y]のところは、わからなかったのでなんとなく書いてしまったので繋がりを聞かれるとどう説明したらいいか分かりません。 貴重なお時間を割いていただいたのにこのような返答しかできなくて申し訳ございません。
guest

回答1

0

ベストアンサー

シンプルにCounter辞書を使った処理にしてはいかがでしょう?

python

1from collections import Counter 2 3data = [ 4 ["A", "B", "C", "D", "E", "E"], 5 ["C", "D", "E", "A", "B", "B"], 6 ["D", "C", "E", "A", "A", "D"], 7 ["D", "A", "C", "B", "D", "E"], 8] 9 10frequency = list(map(Counter, zip(*data))) 11print('frequency:', frequency) 12 13w = [] 14for row in data: 15 f = [] 16 for item, freq in zip(row, frequency): 17 f.append(1 / len(freq) / freq[item]) 18 w.append(f) 19print('w:', w) 20 21s = list(map(sum, w)) 22print('s:', s)

実行結果

frequency: [Counter({'D': 2, 'A': 1, 'C': 1}), Counter({'B': 1, 'D': 1, 'C': 1, 'A': 1}), Counter({'C': 2, 'E': 2}), Counter({'A': 2, 'D': 1, 'B': 1}), Counter({'E': 1, 'B': 1, 'A': 1, 'D': 1}), Counter({'E': 2, 'B': 1, 'D': 1})] w: [[0.3333333333333333, 0.25, 0.25, 0.3333333333333333, 0.25, 0.16666666666666666], [0.3333333333333333, 0.25, 0.25, 0.16666666666666666, 0.25, 0.3333333333333333], [0.16666666666666666, 0.25, 0.25, 0.16666666666666666, 0.25, 0.3333333333333333], [0.16666666666666666, 0.25, 0.25, 0.3333333333333333, 0.25, 0.16666666666666666]] s: [1.5833333333333333, 1.5833333333333333, 1.4166666666666665, 1.4166666666666667]

投稿2022/06/15 03:20

編集2022/06/15 04:14
shiracamus

総合スコア5406

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

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

退会済みユーザー

退会済みユーザー

2022/06/15 04:46

回答していただきありがとうございます。 質問なのですが、s: [1.5833333333333333, 1.5833333333333333, 1.4166666666666665, 1.4166666666666667]をそれぞれ配列数(6)で割ってみたいのですが s = list(map(sum, w/6))とするとエラーになってしまうのですがどのようにすればいいのでしょうか?
shiracamus

2022/06/15 04:53 編集

s = [sum(values) / len(values) for values in w] にするのが簡単です。 mapを使って書くこともできます。 s = list(map(lambda values: sum(values) / len(values), w))
退会済みユーザー

退会済みユーザー

2022/06/15 07:26

教えてくださり、ありがとうございます! プログラミングは奥が深いですね、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問