如何生成包含 4 个元素的所有可能的二进制列表? (使用 Python)
How can I generate all the possible binary lists with 4 elements? (Using Python)
我想知道有没有一种方法可以生成一个列表,其子列表是 0 和 1 与 4 个元素的所有可能组合?要生成单独的子列表,我有
import random
binum = np.random.randint(2, size=4).tolist()
但是我怎样才能得到一个包含所有可能的子列表的完整列表,每个子列表出现一次?所以所需的输出看起来像:
[[0,0,0,0],[0,0,0,1]...[1,0,0,1]...[1,1,1,1]]
(本例一共有16个元素)。谢谢:)
只需遍历从 0 到 15 的数字并获得它们的二进制表示:
In [1]: N = 4
In [2]: def getbit(value, bitnum):
...: mask = 1 << bitnum
...: return (value & mask) >> bitnum
...:
In [3]: [[getbit(i, j) for j in range(N)] for i in range(2 ** N)]
Out[3]:
[[0, 0, 0, 0],
[1, 0, 0, 0],
[0, 1, 0, 0],
[1, 1, 0, 0],
[0, 0, 1, 0],
[1, 0, 1, 0],
[0, 1, 1, 0],
[1, 1, 1, 0],
[0, 0, 0, 1],
[1, 0, 0, 1],
[0, 1, 0, 1],
[1, 1, 0, 1],
[0, 0, 1, 1],
[1, 0, 1, 1],
[0, 1, 1, 1],
[1, 1, 1, 1]]
在 numpy 中相同:
np.unpackbits(np.expand_dims(np.arange(2 ** N, dtype=np.uint8), -1),
axis=1, bitorder='little', count=N)
另外,可以通过对二进制数组进行自增运算来生成下一个元素:
def gen(l=4):
a = [0 for _ in range(l)]
while True:
yield a.copy()
i = 0
while i < l and a[i]:
a[i] = 0
i += 1
if i == l:
break
a[i] = 1
你基本上想要从 0 到 2**n 的所有二进制数。因此,您可以使用以下代码生成它们:
def get_binary_numbers(n):
format_str = f"0{n}b"
max_binary_number = 2**n
return [list(format(i, format_str)) for i in range(max_binary_number)]
注意它的性能,如果你需要很大的 n 值,那么可以使用相同的想法和其他方法来生成列表。
您可以使用 itertools 库获取输入的笛卡尔积
from itertools import product
bit_sets = product(range(2), repeat=4)
# format your data code ...
详情请见 https://docs.python.org/3.1/library/itertools.html?highlight=combinations#itertools.product
我想知道有没有一种方法可以生成一个列表,其子列表是 0 和 1 与 4 个元素的所有可能组合?要生成单独的子列表,我有
import random
binum = np.random.randint(2, size=4).tolist()
但是我怎样才能得到一个包含所有可能的子列表的完整列表,每个子列表出现一次?所以所需的输出看起来像:
[[0,0,0,0],[0,0,0,1]...[1,0,0,1]...[1,1,1,1]]
(本例一共有16个元素)。谢谢:)
只需遍历从 0 到 15 的数字并获得它们的二进制表示:
In [1]: N = 4
In [2]: def getbit(value, bitnum):
...: mask = 1 << bitnum
...: return (value & mask) >> bitnum
...:
In [3]: [[getbit(i, j) for j in range(N)] for i in range(2 ** N)]
Out[3]:
[[0, 0, 0, 0],
[1, 0, 0, 0],
[0, 1, 0, 0],
[1, 1, 0, 0],
[0, 0, 1, 0],
[1, 0, 1, 0],
[0, 1, 1, 0],
[1, 1, 1, 0],
[0, 0, 0, 1],
[1, 0, 0, 1],
[0, 1, 0, 1],
[1, 1, 0, 1],
[0, 0, 1, 1],
[1, 0, 1, 1],
[0, 1, 1, 1],
[1, 1, 1, 1]]
在 numpy 中相同:
np.unpackbits(np.expand_dims(np.arange(2 ** N, dtype=np.uint8), -1),
axis=1, bitorder='little', count=N)
另外,可以通过对二进制数组进行自增运算来生成下一个元素:
def gen(l=4):
a = [0 for _ in range(l)]
while True:
yield a.copy()
i = 0
while i < l and a[i]:
a[i] = 0
i += 1
if i == l:
break
a[i] = 1
你基本上想要从 0 到 2**n 的所有二进制数。因此,您可以使用以下代码生成它们:
def get_binary_numbers(n):
format_str = f"0{n}b"
max_binary_number = 2**n
return [list(format(i, format_str)) for i in range(max_binary_number)]
注意它的性能,如果你需要很大的 n 值,那么可以使用相同的想法和其他方法来生成列表。
您可以使用 itertools 库获取输入的笛卡尔积
from itertools import product
bit_sets = product(range(2), repeat=4)
# format your data code ...
详情请见 https://docs.python.org/3.1/library/itertools.html?highlight=combinations#itertools.product