Преобразование массива, содержащего набор степеней положительного целого числа d, в массив со стандартными элементарными векторами в d-мерном пространстве

Пример того, что я пытаюсь сделать: преобразовать набор мощности d = 2, используя range(2):

[(), (0,), (1,), (0, 1)]

или используя диапазон (1, 3, 1):

[(), (1,), (2,), (1, 2)]

в следующий массив массивов:

[[0, 0], [1, 0], [0, 1], [1, 1]]

В более общем смысле я пытаюсь преобразовать indexSet (набор мощностей положительного числа d) в массив, содержащий стандартные элементарные векторы, где элемент (i,j,k) соответствует вектору (массиву) в d-мерное пространство с единицей в записях i, j и k, и пустое множество соответствует нулевому вектору в d-пространстве (массив d-кортежей с только нулями в его записях).

Мне трудно это делать. Любые предложения будут с благодарностью.

from itertools import chain, combinations
d=5

indexSet = [[] for _ in range(1)]
NumbersUpToD = range(1,int(d)+1,1)
vect = [[0 for i in range(d)] for x in range(d)]
for i in range(d):
    vect[i][i] = vect[i][i] + 1

set_of_d = set(NumbersUpToD)
numbers = [i for i in range(1)]

for z in chain.from_iterable(combinations(set_of_d,r) for r in range(len(set_of_d)+1)):
    indexSet[numbers[0]].append(z)
indexSet = sum(indexSet, [])
for j in range(2**d):
    str(list(indexSet[j]))
print(indexSet)

powerSetVectors = [[0 for x in range(d)] for i in range(2**d)]
print(powerSetVectors)

for i in range(2**d):
    for j in range(d):
        if j in indexSet[j]:
            indexSet[j]=vect[j]
print(indexSet)

Обратите внимание, что вы должны увидеть два набора выходных данных:

[(), (0,), (1,), (2,), (3,), (4,), (0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4), (0, 1, 2), (0, 1, 3), (0, 1, 4), (0, 2, 3), (0, 2, 4), (0, 3, 4), (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4), (0, 1, 2, 3), (0, 1, 2, 4), (0, 1, 3, 4), (0, 2, 3, 4), (1, 2, 3, 4), (0, 1, 2, 3, 4)]

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

1 ответ

Решение

Мои хорошие друзья помогли мне ответить на этот вопрос.

Вот одно альтернативное решение:

def pwr(d,r):
    out = []
    for n in range(2**d):
        p = [r*int(i) for i in list(bin(n)[2:])]
        while len(p) < d:
            p = [0] + p
        out.append(p)
    return out
    print(out)

print(pwr(2,1)) 

с выводом:

[[0, 0], [0, 1], [1, 0], [1, 1]] 
Другие вопросы по тегам