Python 从数组中选择特定元素
我有一个数组:Python 从数组中选择特定元素,python,numpy,Python,Numpy,我有一个数组: 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,
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)])
但没有结果。有什么猜测吗?试试这个:
from itertools import chain, count, tee
lst = [row[i] for row, i in zip(array, chain.from_iterable(zip(*tee(count(), 2))))]
试试这个:
from itertools import chain, count, tee
lst = [row[i] for row, i in zip(array, chain.from_iterable(zip(*tee(count(), 2))))]
如果
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]
如果
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]
由于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
由于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
在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))]
或
或
在任何情况下,输出为:
[['5*', '9*'], ['6*', '7*'], ['3*', '5*'], ['8*', '9*']]
在努比:
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))]
或
或
在任何情况下,输出为:
[['5*', '9*'], ['6*', '7*'], ['3*', '5*'], ['8*', '9*']]
您可能应该移动到numpy…您可能应该移动到numpy…您确定最后一行是正确的吗?在我的NumPy版本(1.5.1)中,
repeat
需要两个参数。那应该是arange
?@Blair,确实应该是arange
,我已经修好了。你确定最后一行是正确的吗?在我的NumPy版本(1.5.1)中,repeat
需要两个参数。那应该是阿兰奇吗?@Blair,确实应该是阿兰奇,我已经修好了。