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

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

ただいまの
回答率

88.80%

Python 二次配列

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 435
退会済みユーザー

退会済みユーザー

前提・実現したいこと

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

やったこと

a= []
with open('matrix.txt','r')as f:
        for line in f:
            a.append(list(map(int, line.split())))

print(a)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tetsunosuke

    2019/05/29 12:11

    はい。コードブロックはこれで問題ありません!

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/05/29 12: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 12: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という行列をどう生成するか、そのために何行何列の行列かを指示したファイルの行を読み、その分だけ必要なデータを数行読み込んで配列にして、また行列の構成を指示した行を読んで、その分だけ必要なデータを読む

    ということですよね?

    キャンセル

回答 2

checkベストアンサー

+1

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

手順

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

サンプルコード

入力ファイル

2 2
1 2
3 4
2 1
5
6

コード

with open("matrix.txt") as f:
    # ファイルを読み込み、空白で分割する。
    tokens = list(map(int, f.read().split()))

def read_matrix(tokens):
    '''tokens から行列を1つ読み込む。
    '''
    rows = tokens.pop(0)
    cols = tokens.pop(0)
    matrix = []
    for i in range(rows):
        row = [tokens.pop(0) for j in range(cols)]
        matrix.append(row)
    return matrix

def print_matrix(matrix):
    '''行列を表示する。
    '''
    for row in matrix:
        print(' '.join(map(str, row)))

a = read_matrix(tokens)
b = read_matrix(tokens)
print_matrix(a)
print_matrix(b)

# a の列数と b の行数が一致していないと行列積は定義されない。
if len(a[0]) != len(b):
    print("invalid matrix combination")
    exit(1)

# 行列積計算 (ijk-algorithm)
ret = [[0 for x in range(len(b[0]))] for y in range(len(a))]
for i in range(len(a)):
    for j in range(len(b[0])):
        for k in range(len(a[0])):
            ret[i][j] += a[i][k] * b[k][j]
print_matrix(ret)

出力

17
39

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

とりあえず、

2 2
1 2
3 4
2 1
5
6

という入力は

2 2
1 2
3 4

2 1
5
6

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

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

行の数 列の数
行列の表現

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

a = [[1,2],
     [3,4]]
b = [[5],
     [6]]

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

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


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る