非常に大きなリストの場合、位置のリストをバイナリのシーケンスに効率的に変換します[重複]

Aug 23 2020

私は非常に多くの位置(DNA遺伝子座)のリストを持っており、それをバイナリのシーケンスに変換する必要があります。

例:

入力:

[3,5] # positions 3 and 5

出力:

[0,0,1,0,1] # 1s only for third and fifth positions

入力リストのサイズは数百万のオーダーであり、最大位置は23億(DNAのサイズ)です。

回答

1 JanChristophTerasa Aug 23 2020 at 20:53

numpy.bincountを使用します:

a = [3, 5]
b = np.bincount(a) # (0, 0, 0, 1, 0, 1) 

スライスすることにより、ゼロインデックス値を無視できます。

b = np.bincount(a)[1:] # (0, 0, 1, 0, 1) 
ShimonCohen Aug 23 2020 at 20:56
arr = [3, 5]
print([1 if num + 1 in arr else 0 for num in range(arr[-1])])

プリント: [0, 0, 1, 0, 1]

Abhilash Aug 23 2020 at 20:55

標準のPythonソリューション:

input_array = [3, 5]
output_array = [1 if i in input_array else 0 for i in range(1,max(input_array)+1)]

出力:

[0, 0, 1, 0, 1]