我正在尝试从正方形列表“ m”中删除特定的行和列。刚开始,我像正方形矩阵“ m”一样使用正方形列表,并尝试使用numpy中的命令“ delete”,如下所示:
from numpy import*
import numpy as np
m=array([[1,2,3],[4,5,6],[7,8,9]])
#deleting row and column "0"
#x is the new matrix without the row and column "0"
x=np.delete((np.delete(m,0,0)),0,1)
print x
x=[[5,6],[8,9]]
命令“ delete”的问题是我不确定该命令是否可以迭代循环使用。具体来说,我想知道如何删除“ y”列表中的特定行和列:
m=([[1,2,3],[4,5,6],[7,8,9]])
y=[[1],[0],[1],[0]]
注意:如果数字“ 1”出现在列表“ y”中,则在列表“ m”中删除相应的行和列。
如果数字“ 1”出现在列表“ y”中,则删除列表“ m”中的相应行和列。例如,在这种情况下,数字“ 1”出现在位置“ 0”的列表“ y”中,我们需要删除列表“ m”中的第一行和第一列。这是列表“ y”中第一个出现的数字“ 1”的所需列表“ m”:
m=[[5,6],[8,9]]
注意:列表“ m”的大小已更改,现在为2x2。这是我的第一个问题,如何在Python中使用动态列表?如何指定新尺寸?
因为数字“ 1”再次出现在列表“ y”中,所以我们需要删除新列表“ m”中的相应行和列,在这种情况下,所需的列表“ m”为:m = [[5]]
我做了很多尝试,从这个论坛上获得了这个技巧(使用理解列表的另一种方式):
#row to delete
roww=0
#column to delete
column=0
m=([[1,2,3],[4,5,6],[7,8,9]])
a=[j[:column]+j[column+1:] for i,j in enumerate(m) if i!=roww]
print a
注意:我不知道如何在python中使用动态数组,因为我需要一些帮助。有人认为这是一种功课,但却是个谎言,我尝试学习Python是因为更加友好。我曾经使用过Fortran,但是我讨厌使用Python。谢谢。
我正在尝试合并一个数组,该数组指定必须删除的行和列。这是我最初的想法:
from numpy import*
import numpy as np
mat=array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
x=[[1],[0],[1],[0]]
for i in x:
if i==1:
row=0
col=0
mat=np.delete(np.delete(mat,row,0),col,1)
print mat
当“ x”的第一行(第0行)中出现一个时,这是所需的矩阵:
mat=array([[6,7,8],[10,11,12],[14,15,16]]
当一个出现在“ x”的第三行(第2行)中时,这是所需的矩阵:
mat=array([[6,8], [14,16]])
注意:x给出要在原始矩阵“ mat”中删除的索引。
再次感谢。
解决方案
在我看来,np.delete重复应用于同一矩阵可以完成此工作:
from __future__ import print_function
import numpy as np
mat = np.array([[1,2,3],[4,5,6],[7,8,9]])
print( "initial mat:\n", mat )
rmlist = [ (2,0), (1,1) ] # a list of (row,col) to be removed
# rmlist = [ [2,0], [1,1] ] # this also works
for (row, col) in rmlist:
print( "removing row", row, "and column", col )
mat = np.delete( np.delete( mat, row, 0 ), col, 1 )
print( mat )
结果(这不是您所期望的...吗?):
initial mat:
[[1 2 3]
[4 5 6]
[7 8 9]]
removing row 2 and column 0
[[2 3]
[5 6]]
removing row 1 and column 1
[[2]]
编辑
如果您需要保留原始矩阵的特定行和列,则可以通过直接选择行和列来实现,例如
print( "initial mat = \n", mat )
print( "sliced mat = \n", mat[ :, [1, 3] ] )
print( "further sliced mat = \n", mat[ :, [1, 3] ][ [1,3] ] )
其中[1,3]表示应保留第一行和第三行(或列)。使用Question中的4x4矩阵,结果变为
initial mat =
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]
sliced mat =
[[ 2 4]
[ 6 8]
[10 12]
[14 16]]
further sliced mat =
[[ 6 8]
[14 16]]
如有必要,您还可以从x = [1,0,1,0]创建上述选择列表(如[1,3]),如下所示:
x = [ 1, 0, 1, 0 ]
s = []
for i in range( len(x) ):
if x[i] == 0: s.append( i )
print( "s = ", s ) # s = [1,3]
print( "further sliced mat (again) = \n", mat[ :, s ][ s ] )