2

我有一个数组:

  X = [[5*,  0,     0,      0,      0,      0,      0,      0],
       [9*,  6,     0,      0,      0,      0,      0,      0],
       [4,   6*,    8,      0,      0,      0,      0,      0],
       [0,   7*,    1,      5,      0,      0,      0,      0],
       [9,   3,     3*,     4,      4,      0,      0,      0],
       [4,   5,     5*,     6,      7,      5,      0,      0],
       [4,   5,     6,      8*,     7,      7,      8,      0], 
       [4,   7,     8,      9*,     7,      3,      9,      6]]

我想选择并附加所有由 * 标记的值。该方法基本上是从第 0 行和第 1 行中选择第 0 个元素......从第 2 行和第 3 行中选择第 1 个元素......依此类推。

结果集应该是:

  Result = ((X[0][0], (X[1][0]), (X[2][1], X[3][1]), (X[4][2], X[5][2]), (X[6][3], X[7][3]))

可以写成:

  Result = ((X[n+0][n], (X[n+1][n]), (X[n+2][n+1], X[n+3][n+1]), (X[n+4][n+2], X[n+5][n+2]), (X[n+6][n+3], X[n+7][n+3]))

  Where n = 0

我怎么做?我已经应用了这个,但它不起作用:

 Result = []

 for a in X:
     Result.append([[[ a[i][j] ] for i in range(0,8)] for j in range(0,8)])

但没有结果。有什么猜测吗?

4

4 回答 4

2

由于 numpy 标签,我想我会添加这个:

import numpy as np
X = np.array([[5 ,  0,     0,      0,      0,      0,      0,      0],
              [9 ,  6,     0,      0,      0,      0,      0,      0],
              [4,   6 ,    8,      0,      0,      0,      0,      0],
              [0,   7 ,    1,      5,      0,      0,      0,      0],
              [9,   3,     3 ,     4,      4,      0,      0,      0],
              [4,   5,     5 ,     6,      7,      5,      0,      0],
              [4,   5,     6,      8 ,     7,      7,      8,      0], 
              [4,   7,     8,      9 ,     7,      3,      9,      6]])
i = np.array([0, 1, 2, 3, 4, 5, 6, 7])
j = np.array([0, 0, 1, 1, 2, 2, 3, 3])

result = X[i, j]
print result
# [5 9 6 7 3 5 8 9]

要在一般情况下生成 i 和 j,您可以执行以下操作:

n = 8
i = np.arange(n)
j = np.arange(n) // 2
于 2013-04-16T04:16:52.417 回答
1

尝试这个:

from itertools import chain, count, tee

lst = [row[i] for row, i in zip(array, chain.from_iterable(zip(*tee(count(), 2))))]
于 2013-04-16T04:02:52.080 回答
1

X如果其中有偶数个列表,这将起作用:

>>> [(X[2*i][i], X[2*i+1][i]) for i in range(len(X)//2)]
[(5, 9), (6, 7), (3, 5), (8, 9)]

如果您不介意扁平列表,那么将适用于X任何长度:

>>> [lst[idx//2] for idx, lst in enumerate(X)]
[5, 9, 6, 7, 3, 5, 8, 9]
于 2013-04-16T04:03:47.940 回答
0

在 Numpy 中:

import numpy as np
x = [['5*','0 ','0 ','0 ','0 ','0 ','0 ','0 '],
     ['9*','6 ','0 ','0 ','0 ','0 ','0 ','0 '],
     ['4 ','6*','8 ','0 ','0 ','0 ','0 ','0 '],
     ['0 ','7*','1 ','5 ','0 ','0 ','0 ','0 '],
     ['9 ','3 ','3*','4 ','4 ','0 ','0 ','0 '],
     ['4 ','5 ','5*','6 ','7 ','5 ','0 ','0 '],
     ['4 ','5 ','6 ','8*','7 ','7 ','8 ','0 '],
     ['4 ','7 ','8 ','9*','7 ','3 ','9 ','6 ']]

a=np.array(x)

然后做一个列表理解和/或 Numpy 切片来获取项目:

[a[i:,j][:2].tolist() for i,j in zip(range(0,7,2),range(0,7,1))]

或者

[a[i*2:,i][:2].tolist() for i in range(len(a)//2)]

或者

a[range(len(a)),np.repeat(range(len(a)//2),2)].reshape(4,2).tolist()

无论如何,输出是:

[['5*', '9*'], ['6*', '7*'], ['3*', '5*'], ['8*', '9*']]
于 2013-04-16T05:48:25.693 回答