0

次のようなデータがあります。たとえば、タブ区切り形式としましょう。

Sample  Dog Cat Tarsier
A47 1   7   2
A48 3   3   4
A51 2   1   8
A53 0   0   0
A54 1   7   2
A57 0   0   10

ここでは明確ではないかもしれませんが、サンプル名は 1 列目にあり、値は犬、猫、メガネザルに対応しています。各サンプルのデータの 90% を残し、残りを PYTHON で削除します。たとえば、サンプル A47 の場合、次のようなものを取得します。

      Cat   Tarsier
A47    7       2

サンプルごとに、サンプル名、動物、数量の 3 つの情報が必要なので、私には難しいです。何かご意見は?前もって感謝します

以下のコメントに従って、2 行目にはすべての数字を含めることができますが、存在する可能性のある他のすべての数字を除外することができます (表示されていません)。これは、この場合は 2 番目の 3 がないため、データの 90% 未満しかなく、データの 90% を超える場合よりも悪い可能性があるためです。これを行う方法は、私の PYTHON プログラミングのスキルを超えています。

4

3 に答える 3

0

Python 3を使用していると仮定すると(Py2でも機能する可能性がありますが、わかりません)、コンマではなくタブで区切られたCSVとして扱います-

import csv

def getvals(file):
    """
        gets the val's from a file of whitespace separated values, and 
        turns them into easy to use Python var's
    """
    samples = csv.reader(open(file))
    s = []
    n = 0
    for row in samples:
        r = [row[0].split()]
        s += r
        n+=1
    return s

その関数は、次のようなセットを返します-

[
 ['Sample', 'Dog', 'Cat', 'Tarsier'], 
 ['A47', '1', '7', '2'], 
 ['A48', '3', '3', '4'], 
 ['A51', '2', '1', '8'], 
 ['A53', '0', '0', '0'], 
 ['A54', '1', '7', '2'], 
 ['A57', '0', '0', '10']
]

そこから、破棄する値を決定するのは数学の問題です。もちろん、forループで計算を実行して、必要な値を返すこともできます。他の多くの関数で再生できる値のセットを返すのが好きなので、そのようにしました。

于 2012-09-14T00:21:04.620 に答える
0

私が正しければ、動物の総数の 10% 以下だったので、「犬」を削除しました。構造体を作りましょう

struct row{
    char *name;
    int animal[3]; //id 0 is dog, 1 is cat and 2 is tarsier
}

次に、読み取りデータをこの構造体に入れるたびに、10% 以下のすべてのフィールドを 0 に設定するだけです。

int i;
float sum=0; //we need float to force the result to be float
for (i=0;i<3;i++){
    sum += row.animal[i]; //count the total row population
}
for (i=0;i<3;i++){ //for every animal
    if (row.animal[i]/sum <= 0.1){ //if this animal is equal or less than 10% of the row population
        row.animal[i]=0; //set his population to 0
    }
}

ご覧のとおり、このコードの動物配列により、任意の (ただし固定の) 数の動物を持つことができます。

于 2012-09-13T23:32:00.780 に答える
0

NumPyを検討することを強くお勧めします。

NumPy を使用すると、構造化配列と呼ばれるものを定義できます。これは、名前を付けて直接アクセスできるさまざまなフィールドで各行が構成される配列です。

データがタブ区切りファイルdata.datに保存されていると仮定すると、説明した形式を使用して、

>>> data = np.genfromtxt('data.txt', delimiter="\t", names=True, dtype=None)

このnp.genfromtxt関数は からデータを読み取り、'data.txt'各行を に沿って分割delimiterし、最初の行を使用してフィールドの名前を取得し ( names=True)、各フィールドのデータ型を推測します ( data=None)。あなたの例では、私は得る

data = array([('A47', 1, 7, 2), ('A48', 3, 3, 4), ('A51', 2, 1, 8),
       ('A53', 0, 0, 0), ('A54', 1, 7, 2), ('A57', 0, 0, 10)], 
      dtype=[('Sample', '|S3'), ('Dog', '<i8'), ('Cat', '<i8'), ('Tarsier', '<i8')])

ここから、フィールドの組み合わせを選択できます

>>> data[["Cat","Tarsier"]]
array([(7, 2), (3, 4), (1, 8), (0, 0), (7, 2), (0, 10)], 
  dtype=[('Cat', '<i8'), ('Tarsier', '<i8')])

または数行のみ:

>>> data[[0,2]]
array([('A47', 1, 7, 2), ('A51', 2, 1, 8)], 
     dtype=[('Sample', '|S3'), ('Dog', '<i8'), ('Cat', '<i8'), ('Tarsier', '<i8')])

フィールドでいくつかの統計を行います。

>>> data["Dog"].mean()
1.1666667

つまり、必要な方法でデータをフィルタリングできます。

于 2012-09-14T09:05:39.503 に答える