Использование перестановочного списка для заполнения двумерного массива в особом порядке

#python #arrays #numpy #itertools

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

Вопрос:

Я хочу создать 2D-массив, содержащий кортежи или списки, для которых требуется определенный порядок.

Используя itertools.product , я способен создавать требуемые перестановки:

 import itertools
import numpy as np

elements = 2
n = 3

temp = []
for tuples in itertools.product(np.arange(elements,-1,-1), repeat=n):
    if sum(tuples) == elements:
        temp.append(tuples)

print temp
  

Это выведет:

 Out[1277]:
array([[2,0,0],
       [1,1,0],
       [1,0,1],
       [0,2,0],
       [0,1,1],
       [0,0,2]])
  

Затем массив должен быть создан для получения:

 array = [[(2,0,0),(1,1,0),(0,2,0)],
         [(1,0,1),(0,1,1),(0,0,0)],
         [(0,0,2),(0,0,0),(0,0,0)]]
  

и впоследствии используется для вычисления точечного произведения:

 array2 = [1,5,10]

np.dot(array, array2)

Out[1278]:
array([2,6,10,11,15,0,20,0,0])
  

Однако, itertools не выдает порядок, который я ищу.
Поэтому я использую argsort и в основном одномерные массивы в конце:

 array = itertools.product(np.arange(elements,-1,-1), repeat=n)

sortedArray = array[array[:,1].argsort()]

print sortedArray

Out[1279]:
array([[2,0,0],
       [1,0,1],
       [0,0,2],
       [1,1,0],
       [0,1,1],
       [0,2,0]])

result = np.dot(sortedList, array2)
  

Это отлично работает в сочетании с np.pad для восстановления исходного размера (3×3 = 9):

 np.pad(result, (0, array.size - result.size), "constant")

Out[1280]:
array([2,6,10,11,15,20,0,0,0])
  

Однако порядок не сохраняется.

Причиной этого является второй ссылочный массив, который использует ту же структуру, что и приведенный выше массив, который может быть расширен:

 reference = [[foo,bar,baz],
             [bar,bar,0],
             [foo, 0, 0]]

np.ravel(reference)

Out[1281]:
array([foo,bar,baz,bar,bar,0,foo,0,0])
  

Я ищу решение, которое не требует обходных действий.

Комментарии:

1. И почему вы сортируете только на основе второго столбца?

2. @yatu Причиной является базовое отображение массивов. Массив2 сортируется по возрастанию значений, так что скалярное произведение всегда дает определенную комбинацию элементов в массиве2.

3. @Fourier С моей стороны, первая строка print list(itertools.product(np.arange(elements,-1,-1), repeat=n) , после () исправления в print (list(itertools.product(np.arange(elements,-1,-1), repeat=n))) , не возвращает то, что вы показываете.

4. @Mathieu Извините, я забыл часть своего кода. Исправлено и спасибо