1

アクセスしたい列の numpy.ndarray があります。8 以降のすべての列を取得して分散をテストし、分散/平均が低い場合は列を削除します。これを行うには、できれば Numpy を使用して、列にアクセスする必要があります。私の現在の方法では、エラーが発生したり、転置に失敗したりします。

これらの配列をマイニングするために、通常の numpy.ndarray を提供する IOPro アダプターを使用しています。

import iopro
import sys

adapter = iopro.text_adapter(sys.argv[1], parser='csv')
all_data = adapter[:]
z_matrix = adapter[range(8,len(all_data[0]))][1:3]

print type(z_matrix) #check type
print z_matrix # print array
print z_matrix.transpose() # attempt transpose (fails)
print z_matrix[:,0] # attempt access by column (fails)

誰かが何が起こっているのか説明できますか?

出力は次のとおりです。

<type 'numpy.ndarray'>
[ (18.712, 64.903, -10.205, -1.346, 0.319, -0.654, 1.52398, 114.495, -75.2488, 1.52184, 111.31, 175.
408, 1.52256, 111.699, -128.141, 1.49227, 111.985, -138.173)
 (17.679, 48.015, -3.152, 0.848, 1.239, -0.3, 1.52975, 113.963, -50.0622, 1.52708, 112.335, -57.4621
, 1.52603, 111.685, -161.098, 1.49204, 113.406, -66.5854)]
[ (18.712, 64.903, -10.205, -1.346, 0.319, -0.654, 1.52398, 114.495, -75.2488, 1.52184, 111.31, 175.
408, 1.52256, 111.699, -128.141, 1.49227, 111.985, -138.173)
 (17.679, 48.015, -3.152, 0.848, 1.239, -0.3, 1.52975, 113.963, -50.0622, 1.52708, 112.335, -57.4621
, 1.52603, 111.685, -161.098, 1.49204, 113.406, -66.5854)]
Traceback (most recent call last):
  File "z-matrix-filtering.py", line 11, in <module>
    print z_matrix[:,0]
IndexError: too many indices

何がうまくいかないのですか?列にアクセスするより良い方法はありますか? ファイルのすべての行を読み取り、8 番目からすべての列をテストして大きな差異がないかどうかをテストし、大きく変化しない列を削除してから、結果を新しい CSV として再出力します。

編集:応答に基づいて、私は次の非常に醜いものを作成しました。私は非常識なアプローチだと思います。

all_data = adapter[:]
z_matrix = []

for line in all_data:
    to_append = []
    for column in range(8,len(all_data.dtype)):
        to_append.append(line[column].astype(np.float16))
    z_matrix.append(to_append)

z_matrix = np.array(z_matrix)

列に直接アクセスする必要がある理由は、データ内に String があるためです。この文字列が何らかの方法で回避されない場合、バッファ エラーを使用するオブジェクト メンバを持つ void-array についてエラーがスローされます。より良い解決策はありますか?これはひどいようで、数ギガバイトのデータでは効率が悪いようです。

4

3 に答える 3

5

の出力print z_matrixは次の形式であることに注意してください。

[ (18.712, 64.903, ..., -138.173)
  (17.679, 48.015, ..., -66.5854)]

つまり、タプルのリストとして出力されます。これは、配列が「構造化配列」の場合に得られる出力です。これは、構造体の 1 次元配列です。配列内の各「要素」には 18 個のフィールドがあります。このエラーは、1 次元配列を 2 次元配列であるかのようにインデックス付けしようとしているために発生します。z_matrix[:,0]動作しません。

詳細を確認するには、配列のデータ型を出力します。例えば

print z_matrix.dtype

フィールドの名前と個々のデータ型が表示されます。

たとえば、要素の 1 つをz_matrix[k](ここでkは整数) として取得したり、「列」(実際には構造化配列のフィールド) に( dtype のフィールドの 1 つにz_matrix['name']変更) としてアクセスしたりできます。'name'

フィールドがすべて同じデータ型である場合 (この例のように、各フィールドが type を持っている場合np.float64)、メソッドの結果を再形成することにより、データの 2 次元ビューを作成できますview。例えば:

z_2d = z_matrix.view(np.float64).reshape(-1, len(z_matrix.dtype.names))

名前ではなく列番号でデータを取得する別の方法は次のとおりです。

col = 8  # The column number (zero-based).
col_data = z_matrix[z_matrix.dtype.names[col]]

構造化配列の詳細については、http://docs.scipy.org/doc/numpy/user/basics.rec.htmlを参照してください。

于 2013-11-08T01:22:07.910 に答える
1

の表示は、タプルの 1 次元配列でz_matrixある shape と一致しています。(2,)

np.array([np.array(a) for a in z_matrix])

(2,18)2 次元配列を生成します。その上で列テストを実行できるはずです。

于 2013-11-08T05:11:56.407 に答える
0

numpy 配列にアクセスするのは非常に簡単です。ここに役立つ簡単な例があります

import numpy as n

A = n.array([[1, 2, 3], [4, 5, 6]])
print A 
>>> array([[1, 2, 3],
           [5, 6, 7]])

A.T                             // To obtain the transpose
>>> array([[1, 5],
           [2, 6],
           [3, 7]])

n.mean(A.T, axis = 1)          // To obtain column wise mean of array A
>>> array([ 3.,  4.,  5.])  

これが、転置および列単位の操作の実行に役立つことを願っています

于 2013-11-08T05:34:19.530 に答える