2017-09-02 6 views
0

特定の数値より大きい数値の絶対値を追加する関数を作成することになっています。私はこれを書いた:numpyを使用せずに行列から特定の値を追加しようとしています

def MatrixSumLarge(vals,large): 

    sum=0 
    sum1=0 
    sum2=0 
    i=0 

    #looking at the rows of the matrix 
    for i in range(len(vals[i])): 
     if abs(vals)>=large: 
      sum1=sum1+i 

     #lookinng at the columns of the matrix 
     for j in range(0,len(vals[j])): 

      if abs(vals[j])>=large: 
       sum2=sum2+vals[j] 

    sum=sum1+sum2 

    return(sum) 

vals=[[1,-2.5,7,4],[-8,9,2,-1.5],[-12,7.5,4.2,11]] 

# setting value of large 
large = 7.1 

#to print the final answer 
print('b) Sum of Large Values = ',MatrixSumLarge(vals,large)) 

をし、エラーを得た:

TypeError: bad operand type for abs(): 'list'

答えて

0

あなたvalsはリストのリストであるので、vals[i]がリストです。ただし、abs()はリストに適用できません。数値(浮動小数点数、整数、または複素数)に適用する必要があります(official document hereを参照)。たとえば、追加のループを追加して、行内の要素を追加することができます。sum(abs(x) for x in vals[i] if x >= 2)

2を必要な数に変更できます。

全体的に、あなたの関数は、あなたの質問からこの

def f(mat, v): 
    row_sums = [sum(abs(x) for x in row if x >= v) for row in mat] 
    return sum(row_sums) 

のようなものを見ることができる、それはあなたが

  • v
  • vまたはxabs(x)を比較したいかどうか、私には非常に明確ではありません合計abs(x)またはx

しかし、必要に応じて上記のコードを調整できるはずです。

リストのリストを平坦化するのに役立つPythonモジュールもあります。この関数はchain.from_iterableと呼ばれます。したがって、上記のコードは次のように書くこともできます。

from itertools import chain 

def f(mat, v): 
    sums = [sum(abs(x) for x in chain.from_iterable(mat) if x >= v] 
    return sum(sums) 
関連する問題