Python 使用置换列表以特殊顺序填充二维数组

Python 使用置换列表以特殊顺序填充二维数组,python,arrays,numpy,itertools,Python,Arrays,Numpy,Itertools,我想创建一个包含元组或列表的二维数组,它需要特定的顺序 使用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(tu

我想创建一个包含元组或列表的二维数组,它需要特定的顺序

使用
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):

但是,该订单不会保留

这样做的原因是第二个引用数组使用了与上述数组相同的结构,可以对其进行拆分:

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])

我正在寻找一种不需要解决的解决方案。

为什么只根据第二列进行排序?@yatu原因是数组的底层映射。Array2是按递增的值排序的,因此点积总是产生Array2中元素的特定组合。@Fourier在我这边,第一行
打印列表(itertools.product(np.arange(elements,-1,-1),repeat=n)
,一旦
()
固定到
打印中(list(itertools.product(np.arange(elements,-1,-1),repeat=n)))
不会返回您显示的内容。@Mathieu抱歉,我忘记了一些代码。修复了,谢谢,为什么只根据第二列进行排序?@yatu原因是数组的基本映射。Array2按递增值排序,因此点积总是产生Array2中元素的特定组合。@Fourier在我这边,第一行
打印列表(itertools.product(np.arange(elements,-1,-1),repeat=n)
,一旦
()
固定到
打印(list(itertools.product(np.arange(elements,-1,-1,repeat=n))
中,就不会返回您显示的内容。@Mathieu抱歉,我忘了一些代码。修复了,谢谢
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])