3つのフィールドの3つの値のセットで、3つのオブジェクトのIDを123,124,126にする必要があります。最終的に、私はobject_idによって値とランクを調べます。np.array、rankdataをスライスしてスライスの親にランク付け
ha = np.array(
[
(123,5,3,4),
(124,4,999,3),
(126,6,5,999)
], dtype=[
('object_id','int8'),('val1','int16'),
('val2','int16'),('val3','int16')])
私はそれらをランク付けしてそのデータを保存する方法を正確にはわかりません。私の計画では、この配列のコピーを作成し、scipy.stats.rankdataを使ってフィールドとランクの値をランク付けしました。
ra = np.copy(ha)
ra['val1'] = rankdata(ha['val1'], method='min').astype(int)
これは、オブジェクトが特定のフィールドの値を持っていないとき、それは999にデフォルト設定し、これらのオブジェクトがランキングから削除する必要がある場合を除いて動作します。今
ra = np.copy(ha)
subset = ha[np.where(ha['val1'] < 999)
ranks = rankdata(subset['val1'], method='min').astype(int)
私の問題をどのように正しい位置に戻って私のRA配列にランク値を取得する:これは私のコードが今どのように見えるのですか?これはhaのサブセットです。つまり、もはやhaまたはraと同じサイズではありません。
EDIT: これは、最初の配列のサブセットを取ってから値を< 999最低から最高まで。
ra = np.array(
[
(123,2,1,2),
(124,1,0,1),
(126,3,2,0)
], dtype=[
('object_id','int8'),('val1','int16'),
('val2','int16'),('val3','int16')])
SOLUTION
>>> ha = np.array(
[
(123,5,3,4),
(124,4,999,3),
(126,6,5,999)
], dtype=[
('object_id','int8'),('val1','int16'),
('val2','int16'),('val3','int16')])
>>> c = np.copy(ha)
>>> i = ha['val2']<999
>>> c['val2'] = 0
>>> c['val2'][i] = rankdata(ha['val2'][i], method='max').astype(int)
>>> c['val2']
array([1, 0, 2], dtype=int16)
私はそれをスライスではなくサブセットとして説明します。 Python/numpy 'slice'には特別な意味があります(例えば、' slice(start、stop、step'または '[start:step:stop]') – hpaulj
名前付き列で作業する場合は、 – DSM