2

私のマトリックスは次のようになります。

 ['Hotel', ' "excellent"', ' "very good"', ' "average"', ' "poor"', ' "terrible"', ' "cheapest"', ' "rank"', ' "total reviews"']
 ['westin', ' 390', ' 291', ' 70', ' 43', ' 19', ' 215', ' 27', ' 813']
 ['ramada', ' 136', ' 67', ' 53', ' 30', ' 24', ' 149', ' 49', ' 310 ']
 ['sutton place', '489', ' 293', ' 106', ' 39', ' 20', ' 299', ' 24', ' 947']
 ['loden', ' 681', ' 134', ' 17', ' 5', ' 0', ' 199', ' 4', ' 837']
 ['hampton inn downtown', ' 241', ' 166', ' 26', ' 5', ' 1', ' 159', ' 21', ' 439']
 ['shangri la', ' 332', ' 45', ' 20', ' 8', ' 2', ' 325', ' 8', ' 407']
 ['residence inn marriott', ' 22', ' 15', ' 5', ' 0', ' 0', ' 179', ' 35', ' 42']
 ['pan pacific', ' 475', ' 262', ' 86', ' 29', ' 16', ' 249', ' 15', ' 868']
 ['sheraton wall center', ' 277', ' 346', ' 150', ' 80', ' 26', ' 249', ' 45', ' 879']
 ['westin bayshore', ' 390', ' 291', ' 70', ' 43', ' 19', ' 199', ' 813']

これから一番上の行と0番目の列を削除して、新しいマトリックスを作成します。

どうすればよいですか?

通常、Javaなどでは次のコードを使用します。

 for (int y; y< matrix[x].length; y++)
     for(int x; x < matrix[Y].length; x++)
      {
        if(x == 0 || y == 0)
         {
           continue
          }
          else
           {
             new_matrix[x][y] = matrix[x][y];
           }


      }

Pythonでこのような要素を繰り返して選択的にコピーする方法はありますか?

ありがとう


編集

また、行列を反復処理するときに、各行列要素を文字列から浮動小数点数に変換しようとしています。

これは、以下の回答に基づいて更新された修正コードです。

A = []
f = open("csv_test.csv",'rt')
try:
    reader = csv.reader(f)
    for row in reader:
        A.append(row)
 finally:
     f.close()

 new_list = [row[1:] for row in A[1:]]
 l = np.array(new_list)
 l.astype(np.float32)
 print l

ただし、エラーが発生します

  --> l.astype(np.float32)
       print l


      ValueError: setting an array element with a sequence.
4

3 に答える 3

5

リストのリストがある場合は、次のようにします。

new_list = [row[1:] for row in current_list[1:]]

したがって、最初の行を無視して新しいマトリックスを作成し、その後の各行について、最初の列を無視します。

それがたまたまだった場合はnumpy.array、次を使用できます。

your_array[1:,1:]
于 2012-10-24T03:05:25.713 に答える
3

基本的な考え方

これが私が思いついたものです:

>>> import numpy as np
>>> l = [['hotel','good','bad'],['hilton',1,2],['ramada',3,4]]
>>> a = np.array(l) # convert to a numpy array to make multi-dimensional slicing possible
>>> a
array([['hotel', 'good', 'bad'],
       ['hilton', '1', '2'],
       ['ramada', '3', '4']], 
      dtype='|S4')
>>> a[1:,1:] # exclude the first row and the first column
array([['1', '2'],
       ['3', '4']], 
      dtype='|S4')
>>> a[1:,1:].astype(np.float32) # convert to float
array([[ 1.,  2.],
       [ 3.,  4.]], dtype=float32)

2Dリストをnumpy配列コンストラクターに渡し、2D配列をスライスして最初の行と列を削除してから、astypeメソッドを使用してすべてをfloatに変換できます。

すべてが1行で、次のようになります。

>>> l = [['hotel','good','bad'],['hilton',1,2],['ramada',3,4]]
>>> np.array(l)[1:,1:].astype(np.float32)
array([[ 1.,  2.],
       [ 3.,  4.]], dtype=float32)

ValueError

あなたはValueError実際にギザギザの配列を持っているので、あなたは得ています。質問のコードの変数を使用して、new_listこれを自分自身に証明できます。

>>> [len(x) for x in new_list]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 8]

最後の行は、他のすべての行と同様に、長さが9ではなく8だけです。2次元のギザギザのリストが与えられると、コンストラクターはのがである1次元のnumpy.arraynumpy配列を作成します。その配列のエントリはPythonリストです。呼び出しはPythonリストをに変換しようとしていますが失敗しています。これは人為的ミスの事例に過ぎないと思います。不足しているエントリを修正した場合は、問題がないはずです。dtypeobjectastypefloat32

于 2012-10-24T03:41:24.700 に答える
0

ネストされたリスト内包表記が必要です。例:

def remove_from_matrix(matrix, columns, rows):
    return [
           [float(matrix[row_num][col_num])
           for col_num in range(len(matrix[row_num])) 
           if not col_num in columns]

           for row_num in range(len(matrix))
           if not row_num in rows]
于 2012-10-24T04:32:24.130 に答える