Python 根据其索引从矩阵中删除列
我有一个二维矩阵Python 根据其索引从矩阵中删除列,python,arrays,list,matrix,Python,Arrays,List,Matrix,我有一个二维矩阵matrixK。例如,它可以是 matrixK = [[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14]] 我需要删除矩阵中的某些列,这些列需要根据依赖于它们作为列的索引的模式来选择。 换句话说, for i in range(number_of_columns) if (i satisfy a certain condtion): column[i] needs to be deleted. 作为最终结果,我需要得到相同
matrixK
。例如,它可以是
matrixK = [[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14]]
我需要删除矩阵中的某些列,这些列需要根据依赖于它们作为列的索引的模式来选择。
换句话说,
for i in range(number_of_columns)
if (i satisfy a certain condtion):
column[i] needs to be deleted.
作为最终结果,我需要得到相同的初始矩阵k
,去掉满足条件的列。什么是最好的蟒蛇式方法
举个例子,参考上面定义的矩阵k
,让我们考虑
for i in range(5):
if (i%2==0):
column[i] needs to be deleted
它应该删除第2列和第4列。如果子列表的长度相同,您可以在列表中使用
zip()
函数,如下所示:
>>> zip(*[j for i, j in enumerate(zip(*matrixK)) if i%2 != 0])
[(1, 3), (6, 8), (11, 13)]
也可以使用布尔索引numpy数组:
>>> arr = np.array(matrixK)
>>> arr[:,np.arange(arr.shape[1])%2 != 0]
array([[ 1, 3],
[ 6, 8],
[11, 13]])
>>>
如果子列表的长度相同,则可以在列表中使用
zip()
函数,如下所示:
>>> zip(*[j for i, j in enumerate(zip(*matrixK)) if i%2 != 0])
[(1, 3), (6, 8), (11, 13)]
也可以使用布尔索引numpy数组:
>>> arr = np.array(matrixK)
>>> arr[:,np.arange(arr.shape[1])%2 != 0]
array([[ 1, 3],
[ 6, 8],
[11, 13]])
>>>
您可以使用
columnsflag
数组来标记需要删除的列
columnFlag = {}
for column in range(number_of_columns):
if(satisfiesCondition(column)):
columnFlag.add(column)
现在,您可以创建一个result
2D数组,该数组的行数与matrixK
和len(columnsflag)
列数小于matrixK
列数
将元素从
matrixK
复制到result
,仅针对不在columnsflag
中的列,并返回result
数组。您可以使用columnsflag
数组标记需要删除的列
columnFlag = {}
for column in range(number_of_columns):
if(satisfiesCondition(column)):
columnFlag.add(column)
现在,您可以创建一个result
2D数组,该数组的行数与matrixK
和len(columnsflag)
列数小于matrixK
列数
将元素从
matrixK
复制到result
,仅针对不在columnsflag
中的列,并返回result
数组。这可以通过两种不同的方式完成,具体取决于您是需要在原始矩阵中删除列,还是只需将其替换为新的列。每种方式的示例如下所示。请注意,两者都不要求矩阵的每一行长度相同
# in-place removal of column in matrix
matrixK = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]
for row in matrixK:
for i in reversed(range(len(row))):
if i % 2 == 0:
del row[i:i+1]
print('matrixK after: {}'.format(matrixK))
或:
两种输出:
[1,3]、[6,8]、[11,13]之后的矩阵k
更多信息
为了充分披露,请注意,还有另一种执行列删除的方法,包括使用内置函数,该函数速度非常快
代码的可读性不如其他两行,只有当矩阵的每一行长度相同时才有效——但它比上面两行快
matrixK = zip(*[row for i, row in enumerate(zip(*matrixK)) if i % 2])
产生:
matrixK之后:[(1,3)、(6,8)、(11,13)]
其中每一行都是一个元组
,而不是一个列表
。如果这是一个问题,可以使用以下方法将其转换为子列表:
matrixK = map(list, zip(*[row for i, row in enumerate(zip(*matrixK)) if i % 2]))
这确实会减慢速度,但仍比前两种方法快一些。这可以通过两种不同的方式完成,具体取决于您是需要在原始矩阵中删除列,还是只需要用新的列替换。每种方式的示例如下所示。
>>> matrixK[:] = map(lambda y : list(filter(lambda x: y.index(x)%2 != 0, y)), matrixK)
>>> matrixK
[[1, 3], [6, 8], [11, 13]]
请注意,两者都不要求矩阵的每一行长度相同
# in-place removal of column in matrix
matrixK = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]
for row in matrixK:
for i in reversed(range(len(row))):
if i % 2 == 0:
del row[i:i+1]
print('matrixK after: {}'.format(matrixK))
或:
两种输出:
[1,3]、[6,8]、[11,13]之后的矩阵k
更多信息
为了充分披露,请注意,还有另一种执行列删除的方法,包括使用内置函数,该函数速度非常快
代码的可读性不如其他两行,只有当矩阵的每一行长度相同时才有效——但它比上面两行快
matrixK = zip(*[row for i, row in enumerate(zip(*matrixK)) if i % 2])
产生:
matrixK之后:[(1,3)、(6,8)、(11,13)]
其中每一行都是一个元组
,而不是一个列表
。如果这是一个问题,可以使用以下方法将其转换为子列表:
matrixK = map(list, zip(*[row for i, row in enumerate(zip(*matrixK)) if i % 2]))
这确实会减慢速度,但仍比前两种方法快一些
>>> matrixK[:] = map(lambda y : list(filter(lambda x: y.index(x)%2 != 0, y)), matrixK)
>>> matrixK
[[1, 3], [6, 8], [11, 13]]
您可以根据实际需要更改过滤器的lambda
功能内的条件
您可以根据实际需要更改过滤器的lambda
功能内的条件如果能分享您已经尝试过的内容,那就太好了。请记住,SO不是代码编写服务。条件i%2==0
将删除列0以及2和4。这是因为Python(和许多其他计算机语言)中的ndexing从0开始。如果能分享您已经尝试过的内容,那就太好了。请记住,SO不是代码编写服务。条件i%2==0
将删除列0以及2和4。这是因为Python(和许多其他计算机语言)中的ndexing从0开始。