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开始。