64142


Aizu online judgeのITP_1_6_Dの問題なのですが  
[http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_6_D&lang=ja](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_6_D&lang=ja)

まず初めに行列のサイズn,m、  
次に(n,m)行列aの要素が複数行に渡って標準入力、  
別の列ベクトルbの要素が複数行に渡って一文字ずつ標準入力  
された時に、a*bとして2つの行列の積を出力することが目標です。

まず、以下のように書くと

[code]

    import numpy as np
    n,m=map(int, input().split())
    a = [input().split() for l in range(n)]
    a_np = np.array(a)
    print(a_np)
    b = [input() for k in range(m)]
    print(b)
    b_pre_np = np.array(int(b))
    b_np = b_pre_np.T
    print(b_np)
    c = a_np @ b_np
    print(c)
    
[/code]

エラーとして

[code]

    TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
    
[/code]

と出て、自分の解釈ではarray内の要素がstrのままで、intかfloatにしないと計算が出来ないと考え、  
色々探してみたのですが、arrayの要素をintに変える事は

[code]

    l_si = ['-10', '0', '100']
    
    l_si_i = [int(s) for s in l_si]
    print(l_si_i)
    # [-10, 0, 100]
    
[/code]

以上の文法を応用しても複数行だとエラーが出てしまいます。(理由も正確には理解できていません。)

[code]

    import numpy as np
    n,m=map(int, input().split())
    a = [input().split() for l in range(n)]
    for row in a_int:
        row[:] = map(int, row)
    a_np = np.array(a)
    print(a_np)
    b = [input() for k in range(m)]
    for row in b:
        row[:] = map(int, row)
    print(b)
    b_pre_np = np.array(int(b))
    b_np = b_pre_np.T
    print(b_np)
    c = a_np @ b_np
    print(c)
    
[/code]

別の記事<https://teratail.com/questions/233166>  
を参考に以上の様にfor文を入れてみたのですが、  
簡潔な場合、例えば

[code]

    array = [['2','13','23','21'],['3','53','13'],['54','32','8','53','7','2']]
    for row in array:
        row[:] = map(int, row)
    print(np.array(array))
    
[/code]

の場合はきちんとintのarrayが出力されるのですが  
今回の場合で実行すると

[code]

    'str' object does not support item assignment
    
[/code]

と出てしまい、お手上げ状態です。  
numpyを使っていることが原因なのでしょうか？  
行列の要素をstrからintに変える機会は少なくないと不勉強の僕でも感じています。。。

どなたか、お手数ですがnumpyを使って2次元行列の要素をstrからintに変える方法、  
または今回のコードの問題点を指摘していただけると大変助かります。

深夜に失礼しますが、よろしくお願い致します。

なにか状況説明等で不十分な点などありましたら適宜速やかに追記させて頂きます。


CC BY-SA 4.0
2020-03-26T16:38:05.193
64139
2020-03-28T01:55:29.393
36869
question
python python3 numpy
与えられた行列の要素をstrからintに変える方法。(が上手く行かず困っています)


[「NumPyのデータ型dtype一覧とastypeによる変換（キャスト）」](https://note.nkmk.me/python-numpy-
dtype-astype/)を参考にして最初のソースのこれらを、

[code]

    a_np = np.array(a)
      ＜途中省略＞
    b_pre_np = np.array(int(b))
    
[/code]

こちらに変更すれば、

[code]

    a_np = np.array(a, dtype='int')
      ＜途中省略＞
    b_pre_np = np.array(b, dtype='int')
    
[/code]

こんな結果が得られます。

[code]

    3 4
    1 2 0 1
    0 3 0 1
    4 1 1 0
    [[1 2 0 1]
     [0 3 0 1]
     [4 1 1 0]]
    1
    2
    3
    0
    ['1', '2', '3', '0']
    [1 2 3 0]
    [5 6 9]
    
[/code]


CC BY-SA 4.0
2020-03-27T01:38:22.483
64142
2020-03-28T01:55:29.393
2020-03-28T01:55:29.393
19110
26370
64139
answer