14

私の R プログラミング ヘッドは、負のスライス インデックスを使用して要素を除外するように配線されています。

例として:

my_list = [0,1,2,3,4,5,6,7,8,9]
my_neg_slice = [-2, -8, 0, -5]

戻るだろう

[1 3 4 6 7 9]

つまり、(0, 2, 5, 8) にないすべてのインデックスを返します。

Python の負のインデックス付けは私にとって非常に目新しいので、これは私の好奇心を満足させるための質問です (これは Python の実装を批判するものではありません。私は非常に気に入っています)。Python で R_Style_Negative_Indexing を実装した人はいますか? 私は Python を初めて使用するので、このタイプのインデックス作成は既に存在している可能性がありますか? 適切なライブラリを拡張するために、誰かがカスタム拡張機能を作成した可能性があります (これが正しい用語でない場合は申し訳ありません)。

明らかに、これを文字列に実装するのは非常に難しいですが、既知のスパース要素のセットを除外することによって、オブジェクト (List、Dict、DataFrame など) にスライスしたいという概念を人々が理解できることを願っています。

Python で負の R スタイルのインデックス作成を実行する私のネアンデルタール人の方法:

import numpy as np

my_list = [0,1,2,3,4,5,6,7,8,9]
my_neg_slice = [-2, -8, 0, -5]

# Convert my_list to a numpy array as it's much easier to work with
step0 = np.array(my_list)

# Same for the negative_slices
step1 = np.array(my_neg_slice)

# Identify the indexes that are negative (assume 0 implies exclude)
step2 = step1 <= 0

# For the negative indexes, flip the sign so they are positive
step3 = -step1[step2]

# Generate the complete index for my_list
step4 = np.arange(len(my_list))

# Identify the indices required by exlucing my_neg_slice indices
step5 = np.setdiff1d(step4, step3)

# Make a cup of tea! Maybe time to rewire the brain and think like a snake!
step6 = step0[step5]

print(step6)
[1 3 4 6 7 9]

クラックしようとしている特定の問題はありません。インデックス作成の可能性について理解を深めたいだけですか? よろしくお願いします。バーティ。

4

5 に答える 5

2

使用セット:

>>> set([0,1,2,3,4,5,6,7,8,9]) - set([0,2,5,8])
set([1, 3, 4, 6, 7, 9])

(負の値ではなく正の値を使用してください)。

于 2013-08-14T22:03:35.487 に答える
1

This uses a slightly different format for my_neg_slice, but the following is a Pythonic way to filter an iterable in the way you are describing:

>>> my_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> my_neg_slice = set([2, 8, 0, 5])
>>> [x for i, x in enumerate(my_list) if i not in my_neg_slice]
[1, 3, 4, 6, 7, 9]
于 2013-08-14T22:07:08.127 に答える
1

これは興味深い質問です。numpyバージョンを提供しようと思いました。私の知る限り、データ内のインデックスのリストを作成し、不要なものを削除する、あなたが与えたものと同様のプロセスに依存する必要があります。

mask = np.ones(len(my_list), dtype=bool)
for i in my_neg_slice:
    mask[i] = False
my_list[mask]

ただし、マスク配列に と同じ数の要素が必要になるという意味では、少し無駄ですmy_list。@FJ による回答は、「含まれていない」スライスのスパース性を保持しているため、優れています。

アップデート

numpy何らかのマスキングを使用してこれを行う必要があることを確認するメーリング リストの投稿を見つけました: http://mail.scipy.org/pipermail/numpy-discussion/2008-May/034021.html

于 2013-08-14T22:11:31.793 に答える