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