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

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

新規登録して質問してみよう
ただいま回答率
85.47%
配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

175閲覧

Python 二次配列

退会済みユーザー

退会済みユーザー

総合スコア0

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/05/29 02:55

編集2019/05/29 04:11

前提・実現したいこと

Pythonについて
進め方を教えてください。

該当のソースコード

Python
以下、エクササイズ

Read two matrices from a file named 'd.txt'.

Sample input :
2 2
1 2
3 4
2 1
5
6
Sample output:
17
39

###やったこと

Python

1a= [] 2with open('matrix.txt','r')as f: 3 for line in f: 4 a.append(list(map(int, line.split()))) 5 6print(a) 7

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

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

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

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

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

tetsunosuke

2019/05/29 03:04

https://teratail.com/help/question-tips#questionTips3-5-1 プログラムの部分(やったこと) については、コードブロックを使って表記しましょう。 ちなみに プログラム以前に問題の内容はちゃんと理解できていますかね? 日本語でいえばどの数字をどう計算した結果を求めたいかを式で書いて、それを順次プログラムにしていく、という流れになるかと思いますが。
退会済みユーザー

退会済みユーザー

2019/05/29 03:10

ありがとうございます。はじめて投稿するのでわかりませんでした。 一旦、コードブロック使用してみました
tetsunosuke

2019/05/29 03:11

はい。コードブロックはこれで問題ありません!
退会済みユーザー

退会済みユーザー

2019/05/29 03:17

matrix.txtを作成、sample input 内の数字を入れ保存、Pythonで出力し [[2, 2], [1, 2], [3, 4], [2, 1], [5], [6]]となりました。そして[2, 2]をそれぞれm1Row= a[0][0] m1Column= a[0][1]へ。 [1,2] [3,4]を、for文で繰り返そうしましたがよくわからなくなってしまい、質問させていただいた次第です。
tetsunosuke

2019/05/29 03:36

問題文をちゃんと日本語で解釈してほしいです。 このサンプルの6行は、以下のようになっているはずです。 1行目:最初の行列Aは2x2行列であることを表す 2 2 2-3行目:2x2行列の中身を表す 1 2 3 4 4行目:次の行列Bは2x1行列であることを表す 5-6行目: 2x1行列の中身を表す 5 6 したがってこの場合の計算は AxBの結果として、 1*5 + 2*4 = 17 3*5 + 4*6 = 39 よって、 17 39 という出力を得る ということですよね。 つまり、まずやるべきなのは、 AとBという行列をどう生成するか、そのために何行何列の行列かを指示したファイルの行を読み、その分だけ必要なデータを数行読み込んで配列にして、また行列の構成を指示した行を読んで、その分だけ必要なデータを読む ということですよね?
guest

回答2

0

ベストアンサー

Python の標準ライブラリだけ使って書くと以下のようになります。

手順

  1. ファイルから読み込み、空白で分割する。分割したリストをトークンとする。
  2. トークンから2個読み込み、行数と列数とする。
  3. トークンから行数 * 列数個読み込み、各成分の値とする。
  4. 2, 3 をもう一度繰り返す。
  5. 読み込んだ2つの行列の行列積を計算する。

サンプルコード

入力ファイル

txt

12 2 21 2 33 4 42 1 55 66

コード

python

1with open("matrix.txt") as f: 2 # ファイルを読み込み、空白で分割する。 3 tokens = list(map(int, f.read().split())) 4 5def read_matrix(tokens): 6 '''tokens から行列を1つ読み込む。 7 ''' 8 rows = tokens.pop(0) 9 cols = tokens.pop(0) 10 matrix = [] 11 for i in range(rows): 12 row = [tokens.pop(0) for j in range(cols)] 13 matrix.append(row) 14 return matrix 15 16def print_matrix(matrix): 17 '''行列を表示する。 18 ''' 19 for row in matrix: 20 print(' '.join(map(str, row))) 21 22a = read_matrix(tokens) 23b = read_matrix(tokens) 24print_matrix(a) 25print_matrix(b) 26 27# a の列数と b の行数が一致していないと行列積は定義されない。 28if len(a[0]) != len(b): 29 print("invalid matrix combination") 30 exit(1) 31 32# 行列積計算 (ijk-algorithm) 33ret = [[0 for x in range(len(b[0]))] for y in range(len(a))] 34for i in range(len(a)): 35 for j in range(len(b[0])): 36 for k in range(len(a[0])): 37 ret[i][j] += a[i][k] * b[k][j] 38print_matrix(ret)

出力

17 39

投稿2019/05/29 03:36

編集2019/05/29 03:42
tiitoi

総合スコア21956

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

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

0

とりあえず、

2 2 1 2 3 4 2 1 5 6

という入力は

2 2 1 2 3 4

2 1 5 6

に分かれるということを理解する必要があるでしょう。

1つの行列を表すフォーマット

行の数 列の数 行列の表現

だから、↓のようなリストをまずは作る必要があります。

python

1a = [[1,2], 2 [3,4]] 3b = [[5], 4 [6]] 5 6# あるいはまとめてリストに格納。こっちの方が処理が書きやすいメリットがある 7[[[1,2],[3,4]], [[5],[6]]]

行列積の計算はなんとかしましょう。面倒くさいけどループ回せばできます。


質問文のコードを見る限りだと、明らかに実力以上のものに取り組まれていると思います。たとえばfor m1 in m1Row:は整数をforでループさせようとしているので、ひと目見ておかしいなと思う訳です。インデントとかの不揃いさも、慣れていないことを伺わせます。

自分で選んだ課題なら、もう少し基礎的なところからコツコツやることを考えましょう。学校・職場で出されたものなら、単位・給料よさらばということになるかもしれません。

投稿2019/05/29 03:49

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問