Разделить ячейки на две и и образуют np.array

#python #arrays #numpy #itertools

#python #массивы #numpy #python-itertools

Вопрос:

 list(itertools.product([[True,False],[False, True]], repeat=2))
  

Приведенная выше команда выдает вывод, приведенный ниже.

 [((True, False), (True, False)),
 ((True, False), (False, True)),
 ((False, True), (True, False)),
 ((False, True), (False, True))]
  

Однако я хочу, чтобы это выглядело так:

 array([[ True, False, True, False],
       [ True, False, False, True],
       [False, True, True, False],
       [False, True, False, True]])
  

Все поможет!

Ответ №1:

Сначала создайте свой продукт:

 pr = list(itertools.product([[True, False], [False, True]], repeat=2))
  

Затем преобразуйте его в массив Numpy с соответствующим изменением формы:

 a = np.array(pr).reshape((len(pr), -1))
  

Результатом является:

 array([[ True, False,  True, False],
       [ True, False, False,  True],
       [False,  True,  True, False],
       [False,  True, False,  True]])
  

Этот код работает также для других значений repeat (проверьте, например, для
повтор=3).

И замечание о других решениях: все они, за исключением mathfux, генерируют простые pythonic списки, а не Numpy массивы (как вы указали).

Ответ №2:

Значения списка продуктов являются кортежами.

Вы можете перебирать кортежи списка продуктов,

каждый раз объединяйте кортежи каждого списка в новый список:

например

 ([True, False], [True, False]) -> [True, False, True, False]
  

Вариант 1

 import itertools

x = list(itertools.product([[True,False],[False, True]], repeat=2))

x = [list(v[0]   v[1]) for v in x]

# [[True, False, True, False], [True, False, False, True], [False, True, True, False], [False, True, False, True]]
print(x)

  

Вариант 2: одна строка

 import itertools

x = [list(v[0]   v[1]) for v in list(itertools.product([[True,False],[False, True]], repeat=2))]

# [[True, False, True, False], [True, False, False, True], [False, True, True, False], [False, True, False, True]]
print(x)
  

Ответ №3:

В numpy терминах вам нужно изменить его форму:

 X = [((True, False), (True, False)),
 ((True, False), (False, True)),
 ((False, True), (True, False)),
 ((False, True), (False, True))]
np.array(X).reshape(4,4)
[[ True False  True False]
 [ True False False  True]
 [False  True  True False]
 [False  True False  True]]
  

Ответ №4:

 out = [[*a, *b] for a, b in itertools.product([[True,False],[False, True]], repeat=2)]
print(out)
  

С принтами:

 [[True, False, True, False], 
 [True, False, False, True],
 [False, True, True, False], 
 [False, True, False, True]]