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

时间:2019-03-28 14:07:11

标签: python arrays numpy 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结合使用可很好地恢复原始大小(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])

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

0 个答案:

没有答案