您确实应该包含一个示例运行 - 这样我们就可以看到您的代码产生了什么,而无需自己运行它。
In [85]: matpos = np.arange(10)
In [86]: sumtot = np.array([])
...: for j in range(0,len(matpos)-1):
...: sum = matpos[j] + matpos[j+1:]
...: sumtot = np.append(sumtot, sum)
...:
In [87]: sumtot
Out[87]:
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 3., 4., 5., 6.,
7., 8., 9., 10., 5., 6., 7., 8., 9., 10., 11., 7., 8.,
9., 10., 11., 12., 9., 10., 11., 12., 13., 11., 12., 13., 14.,
13., 14., 15., 15., 16., 17.])
但这并不是特别有指导意义。另外np.append 比列表追加慢。
所以让我们使用列表:
In [88]: sumtot = []
...: for j in range(0,len(matpos)-1):
...: sum = matpos[j] + matpos[j+1:]
...: sumtot.append(sum)
...:
...:
In [89]: sumtot
Out[89]:
[array([1, 2, 3, 4, 5, 6, 7, 8, 9]),
array([ 3, 4, 5, 6, 7, 8, 9, 10]),
array([ 5, 6, 7, 8, 9, 10, 11]),
array([ 7, 8, 9, 10, 11, 12]),
array([ 9, 10, 11, 12, 13]),
array([11, 12, 13, 14]),
array([13, 14, 15]),
array([15, 16]),
array([17])]
这样可以更好地了解您在做什么 - 并不是说它看起来特别合乎逻辑:)
或者要得到一个平面列表,使用extend:
In [90]: sumtot = []
...: for j in range(0,len(matpos)-1):
...: sum = matpos[j] + matpos[j+1:]
...: sumtot.extend(sum)
...:
In [91]: sumtot
Out[91]:
[1,
2,
3,
...
16,
17]
或者为了更漂亮的显示:
In [92]: np.array(sumtot)
Out[92]:
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 5, 6, 7, 8, 9, 10,
5, 6, 7, 8, 9, 10, 11, 7, 8, 9, 10, 11, 12, 9, 10, 11, 12,
13, 11, 12, 13, 14, 13, 14, 15, 15, 16, 17])
我怀疑这个列表扩展版本和我们得到的一样好。 [89] 中的参差不齐的列表表明“纯”numpy 解决方案不太可能,或者充其量是复杂的。
编辑
用你的新例子:
In [93]: matpos = np.array([0, 1, 2, 3])
...
In [96]: sumtot = []
...: for j in range(0,len(matpos)-1):
...: sum = matpos[j] + matpos[j+1:]
...: sumtot.append(sum)
...:
...:
In [97]: sumtot
Out[97]: [array([1, 2, 3]), array([3, 4]), array([5])]
triu:
另一个答案使用triu。
让我们实验一下:
In [98]: matpos[:,None]+matpos
Out[98]:
array([[0, 1, 2, 3],
[1, 2, 3, 4],
[2, 3, 4, 5],
[3, 4, 5, 6]])
In [100]: np.tril(__,-1)
Out[100]:
array([[0, 0, 0, 0],
[1, 0, 0, 0],
[2, 3, 0, 0],
[3, 4, 5, 0]])
对于更大的例子:
In [101]: matpos = np.arange(10)
In [102]: matpos[:,None]+matpos
Out[102]:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
[ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
[ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
[ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
[ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
[ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]])
In [103]: np.tril(_,-1)
Out[103]:
array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 2, 3, 0, 0, 0, 0, 0, 0, 0, 0],
[ 3, 4, 5, 0, 0, 0, 0, 0, 0, 0],
[ 4, 5, 6, 7, 0, 0, 0, 0, 0, 0],
[ 5, 6, 7, 8, 9, 0, 0, 0, 0, 0],
[ 6, 7, 8, 9, 10, 11, 0, 0, 0, 0],
[ 7, 8, 9, 10, 11, 12, 13, 0, 0, 0],
[ 8, 9, 10, 11, 12, 13, 14, 15, 0, 0],
[ 9, 10, 11, 12, 13, 14, 15, 16, 17, 0]])
所以非零值匹配。
并使用triu_indices提取值:
In [112]: idx = np.triu_indices_from(Out[102],1)
In [113]: Out[102][idx]
Out[113]:
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 5, 6, 7, 8, 9, 10,
5, 6, 7, 8, 9, 10, 11, 7, 8, 9, 10, 11, 12, 9, 10, 11, 12,
13, 11, 12, 13, 14, 13, 14, 15, 15, 16, 17])