2017-02-09 3 views
2

私はPythonでベクトルを取得していますが、これらの2つの値がゼロでないという条件で、ベクトルX_valid(sizes - 9 dimensions) 。私は簡単に私のベクターから2つの値を選ぶことができます:[13, 0, 0, 0, 11, 11, 0, 3, 0]Pythonのベクトルから0より大きい2つの値をランダムに選ぶ

indx1 = randint(0, 8) 
indx2 = randint(0, 8) 
X_valid[0][indx1] = 0 
X_valid[0][indx2] = 0 

私のベクトルのサンプルは次のとおりです。 しかし、私は知りたいのですが、X_valid[0][indx1 or indx2]が0より大きいという条件でこれらの2つの値を選択するにはどうすればいいですか?そのピッキングをどうすればできますか?このような

+0

異なる*値/エントリであるか、または13を2回拾うか両方の11を選んでもOKですか? –

+0

理想的には値が異なっています(今のところ、同じ2つの値を選ぶことができます)。 –

答えて

3

1つの方法は、非ゼロ要素のインデックスを取得してから選択することです。

non_zero = [i for i, x in enumerate(X_valid) if x != 0] 
X_valid[0][random.choice(non_zero)] = 0 

しかし、このアプローチは、再び選択する前non_zeroから最初のインデックスを削除する必要がありますし、中から選択する非ゼロ要素がたくさんある場合は、比較的高価である可能性があります。

ゼロ以外の要素が見つかるまでランダムなインデックスを生成する方法もあります。

c = 2 
while c > 0: 
    index = randint(0,8) 
    if X_valid[0][indx] == 0: 
     continue 
    X_valid[0][indx] = 0 
    c = c - 1 

ゼロ以外の要素がたくさんあると仮定して、複数のゼロ要素をランダムに選択することはまずありません。

(両方のアプローチは、から選択する十分な非ゼロの要素があることを前提とし、最初のものは、それが当てはまらない場合、それは容易に検出することができる。)*

1

何かが典型的である:もちろん

while True: 
    i = random.randint(0, 8) 
    j = random.randint(0, 9) 
    if i != j and X_valid[0][i] > 0 and X_valid[0][j] > 0: 
     break 
X_valid[0][i] = 0 
X_valid[0][j] = 0 

、それは永遠にループ意志の条件を満たすことができない場合。

+0

@StefanPochmann: '[indx1 or indx2]は意図したものではないということは肯定的です。 –

関連する問題