Ради развлечений, в, вот это чистый способ:
>>> n = 2
>>> (np.arange(2**n) // ((1 << np.arange(n)[::-1,None]))) & 1
array([[0, 0, 1, 1],
[0, 1, 0, 1]])
>>> n = 4
>>> (np.arange(2**n) // ((1 << np.arange(n)[::-1,None]))) & 1
array([[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]])
Некоторые пояснения (обратите внимание, что это очень маловероятно, что я никогда ничего подобного выше в производстве код записи):
Сначала мы получаем число, которые нам нужны биты:
>>> np.arange(2**n)
array([0, 1, 2, 3])
Тогда показатели степеней 2, мы заботимся о:
>>> np.arange(n)
array([0, 1])
Bitshift 1 этих, чтобы получить полномочия двух:
>>> 1 << np.arange(n)
array([1, 2])
переставляет заказ для эстетических целей:
>>> (1 << np.arange(n))[::-1]
array([2, 1])
Используйте None
ввести дополнительную ось, так что мы можем вещать:
>>> (1 << np.arange(n))[::-1, None]
array([[2],
[1]])
Divide:
>>> np.arange(2**n) // (1 << np.arange(n))[::-1, None]
array([[0, 0, 1, 1],
[0, 1, 2, 3]])
Возьмите только первый бит:
>>> (np.arange(2**n) // (1 << np.arange(n))[::-1, None]) & 1
array([[0, 0, 1, 1],
[0, 1, 0, 1]])
, возможно, связано: http://stackoverflow.com/questions/1208118/using-numpy-to-build-an-array-of-all-combinations-of- двух-массивы – alko