1

私のコードは、提供されたファイル alpha.txt の各行の最小/最大/合計を計算できますが、列ごとに最小/最大/合計を計算することはできません....それを行う方法についてのアイデアは役に立ちます、ありがとう!

def load_data():

    usrnput = input("Enter a filename ")
    my_list = [[float(i) for i in line.split(',')] for line in open(usrnput, "+r")]


    row = len(my_list)
    column = len(my_list[0])

    if row != column:
        print("invalid")
    else:
        pass

    count = 0
    for row in(my_list):
        count = count + 1
        print(count, row)



    secondc = input("Enter a number ")
    if secondc == '2':
      minimum(my_list)
    elif secondc =='3':
        maximum(my_list)
    elif secondc =='4':
        sum1(my_list)

def minimum(my_list):
    pickaposition = input("Enter a row or column: ")
    if pickaposition == ('1'):
        print(min(my_list[0]))
    elif pickaposition == ('2'):
        print(min(my_list[1]))
    elif pickaposition == ('3'): 
        print(min(my_list[2]))
    elif pickaposition == ('4'):
        print(min(my_list[3]))
    elif pickaposition == ('5'):
        print(min(my_list[4]))


def maximum(my_list):
    pickaposition = input("Enter a row or column: ")
    if pickaposition == ('1'):
        print(max(my_list[0]))
    elif pickaposition == ('2'):
        print(max(my_list[1]))
    elif pickaposition == ('3'): 
        print(max(my_list[2]))
    elif pickaposition == ('4'):
        print(max(my_list[3]))
    elif pickaposition == ('5'):
        print(max(my_list[4]))

def sum1(my_list):
    pickaposition = input("Enter a row or column: ")
    if pickaposition == ('1'):
        print(sum(my_list[0]))
    elif pickaposition == ('2'):
        print(sum(my_list[1]))
    elif pickaposition == ('3'): 
        print(sum(my_list[2]))
    elif pickaposition == ('4'):
        print(sum(my_list[3]))
    elif pickaposition == ('5'):
        print(sum(my_list[4]))

def main():
    print("""1 - Open and load from a file
2 - Minimum
3 - Maximum 
4 - Sum 
5 - Delete
6 - Save
7 - Save as (specify new file name)
0 - Exit
""")
    pick = input("Enter a number ")

    if pick == "1":
        load_data()
    else:
        pass





main()

また、alpha.txtにはデータが含まれています

5,4,2,3.2
1,.2,4.4,8
3,8,6.5,2
3,2,1,5.3

列に基づいて変数 AZ を割り当てる必要がありますが、それを行う方法もわかりません。

これが私のコードの完全な実行例です。

1 - Open and load from a file
2 - Minimum
3 - Maximum 
4 - Sum 
5 - Delete
6 - Save
7 - Save as (specify new file name)
0 - Exit

Enter a number 1
Enter a filename alpha.txt
1 [5.0, 4.0, 2.0, 3.2]
2 [1.0, 0.2, 4.4, 8.0]
3 [3.0, 8.0, 6.5, 2.0]
4 [3.0, 2.0, 1.0, 5.3]
Enter a number 3
Enter a row or column: 3
8.0
>>> 
4

4 に答える 4

2

あなたの質問は次のようになります: グリッド/マトリックスを表すリストのリストがあれば、行を抽出するのは簡単ですが、列をどのように抽出しますか?

行を実行する方法は次のとおりです。

>>> a = [[5, 4, 3, 3.2], [1, .2, 4.4, 8], [3, 8, 6.5, 2], [3, 2, 1, 5.3]]
>>> a[0]
[5, 4, 3, 3.2]

これは、コラムを作成する骨の折れる方法です。最初のインデックスは変更されますが、2 番目のインデックスは変更されないことに注意してください。つまり、各行の要素 2 を選択すると、列が得られます!

>>> column_two = [a[0][2], a[1][2], a[2][2], a[3][2]]
>>> column_two
[3, 4.4, 6.5, 1]

リスト内包表記を使用すると、これを簡単に行うことができます。

>>> [x[2] for x in a]
[3, 4.4, 6.5, 1]
>>> 

これは、次のことと同等です。

column_two = []
for row in a:
    column_two.append(row[2])

この後、既存の関数を再利用して、行の代わりに抽出した列を渡すことができます。

于 2013-10-30T17:14:30.557 に答える
1

次のようにして、列を合計できるはずです。

def sumcolumn(my_list):
total = 0.0
pickaposition = input("Enter a column: ")
if pickaposition == ('1'):
    for x in row:
        total += my_list[x][0]
    print total
elif pickaposition == ('2'):
    for x in row:
        total += my_list[x][1]
    print total
elif pickaposition == ('3'): 
    for x in row:
        total += my_list[x][2]
    print total
elif pickaposition == ('4'):
    for x in row:
        total += my_list[x][3]
    print total
elif pickaposition == ('5'):
    for x in row:
        total += my_list[x][4]
    print total

明らかに、これはあまりきれいでもPythonicでもありませんが、アイデアを提供するのに十分シンプルであり、仕様に合わせて調整できることを願っています. 1 から 5 までの数値かどうかをブロック チェックし、total += my_list[x][pickaposition-1] を使用して多くの行を節約することをお勧めします。

最小/最大について助けが必要な場合は、それらの例も挙げることができますが、うまくいけば、これからそれを行う方法を考え出すことができます.

于 2013-10-30T17:13:16.413 に答える
1

テーブル内のすべての要素が同じ数値型である場合は、数値計算を非常に迅速に実行できるnumpy配列の使用を検討してください。

例:

import numpy

dataList = [[5, 4, 3, 3.2], [1, .2, 4.4, 8], [3, 8, 6.5, 2], [3, 2, 1, 5.3]] # this is a list of lists

dataArray = numpy.asarray(dataList)

次に、配列を見てみましょう。

dataArray
dataArray.dtype

出力が生成されます。

array([[ 5. ,  4. ,  3. ,  3.2],
       [ 1. ,  0.2,  4.4,  8. ],
       [ 3. ,  8. ,  6.5,  2. ],
       [ 3. ,  2. ,  1. ,  5.3]])
dtype('float64')

Python は、float643.2、0.2、6.5 などの要素に対応するように、各要素の型を定義することにしました。

要素の dtype を決定して割り当てることができます。(参照セクションの ndarray に関するページを読んでください)。

axis=0それが垂直方向でありaxis=1、numpy 2 次元配列の水平方向であることを覚えておいてください。実際にはn次元配列を持ち、それに応じて軸を指定できます。

必要なものを計算するための高速で効率的な方法については、次のとおりです。

  • columnSums = dataArray.sum(axis=0)
    columnSums
    

    これは以下を生成します:

    array([ 12. ,  14.2,  14.9,  18.5])
    

    rowSums = dataArray.sum(axis=1)
    rowSums
    

    これは以下を生成します:

    array([ 15.2,  13.6,  19.5,  11.3])
    

    overallSum = dataArray.sum()
    overallSum
    

    つまり:

    59.599999999999994
    

同様に:

  • columnMins = dataArray.min(axis=0)
    rowMins = dataArray.min(axis=1)
    overallMin = dataArray.min()
    
  • 最大

    columnMaximums = dataArray.max(axis=0)
    rowMaximums = dataArray.max(axis=1)
    overallMax = dataArray.max(dataArray)
    

次のようなこともできます。

thirdColSum = dataArray[:,2].sum()
lastRowSum = dataArray[-1].sum()
firstColAndTopTowRowsMin = dataArray[0:2,0].min()
bottomThreeRowsAndLastTwoCol = dataArray[-3:,-2:]
bottomThreeRowsAndLastTwoColMax = dataArray[-3:,-2:].max()

参考文献:

  1. http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html
  2. http://docs.scipy.org/doc/numpy/user/basics.indexing.html
  3. http://docs.scipy.org/doc/numpy/reference/routines.html
  4. http://docs.scipy.org/doc/numpy/reference/routines.math.html
于 2013-10-30T20:38:29.850 に答える