Я хочу создать двумерный массив, содержащий кортежи или списки, для которых требуется определенный порядок.
Использование 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
и в основном 1D-массивы:
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
для восстановления исходного размера (3x3 = 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])
Я ищу решение, которое не требует обходного решения.