Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从numpy矩阵中排除元素_Python_Numpy - Fatal编程技术网

Python 如何从numpy矩阵中排除元素

Python 如何从numpy矩阵中排除元素,python,numpy,Python,Numpy,假设我们有一个矩阵: mat = np.random.randn(5,5) array([[-1.3979852 , -0.37711369, -1.99509723, -0.6151796 , -0.78780951], [ 0.12491113, 0.90526669, -0.18217331, 1.1252506 , -0.31782889], [-3.5933008 , -0.17981343, 0.91469733, -0.59719805, 0.

假设我们有一个矩阵:

mat = np.random.randn(5,5)

array([[-1.3979852 , -0.37711369, -1.99509723, -0.6151796 , -0.78780951],
       [ 0.12491113,  0.90526669, -0.18217331,  1.1252506 , -0.31782889],
       [-3.5933008 , -0.17981343,  0.91469733, -0.59719805,  0.12728085],
       [ 0.6906646 ,  0.2316733 , -0.2804641 ,  1.39864598, -0.09113139],
       [-0.38012856, -1.7230821 , -0.5779237 ,  0.30610451, -1.30015299]])
还假设我们有一个索引数组:

idx = np.array([0,4,3,1,3])
我们可以使用以下方法从矩阵中提取元素:

mat[idx, range(len(idx))]
array([-1.3979852 , -1.7230821 , -0.2804641 ,  1.1252506 , -0.09113139])
我想知道的是如何使用索引从矩阵中排除元素,即如何获得以下结果:

array([[0.12491113 , -0.37711369, -1.99509723, -0.6151796 , -0.78780951],
       [-3.5933008 ,  0.90526669, -0.18217331, -0.59719805, -0.31782889],
       [0.6906646  , -0.17981343,  0.91469733,  1.39864598,  0.12728085],
       [-0.38012856,  0.2316733 , -0.5779237 ,  0.30610451, -1.30015299]])
本以为这就像做
mat[-idx,range(len(idx))]
一样简单,但这不起作用。我也试过
np.delete()
,但似乎也不行。有没有不需要循环或列表理解的解决方案?如果您有任何见解,我将不胜感激。谢谢


编辑:数据在处理后必须在同一列中。

当你说“删除”不起作用时,你是什么意思?它有什么作用?这可能是诊断性的

让我们首先看一下有效的选择:

In [484]: mat=np.arange(25).reshape(5,5) # I like this better than random

In [485]: mat[idx,range(5)]
Out[485]: array([ 0, 21, 17,  8, 19])
这也可用于文件的展开版本:

In [486]: mat.flat[idx*5+np.arange(5)]
Out[486]: array([ 0, 21, 17,  8, 19])
现在,使用默认平面
delete
尝试相同的操作:

In [487]: np.delete(mat,idx*5+np.arange(5)).reshape(5,4)
Out[487]: 
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  9],
       [10, 11, 12, 13],
       [14, 15, 16, 18],
       [20, 22, 23, 24]])
delete
不是就地运算符;它返回一个新的矩阵。如果指定一个轴,
delete
将删除整行或整列,而不是选定的项目

mat[-idx,range(len(idx))]
不起作用,因为负索引已经有了意义-
从末尾开始计数

delete
最终执行布尔索引,因此:

In [498]: mat1=mat.ravel()
In [499]: idx1=idx*5+np.arange(5)
In [500]: ii=np.ones(mat1.shape, bool)
In [501]: ii[idx1]=False
In [502]: mat1[ii]
Out[502]: 
array([ 1,  3,  4,  5,  6,  7,  8,  9, 10, 12, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24])
即使您从每行中删除不同数量的项,这种索引/删除也可以工作。当然,在这种情况下,您不能指望将矩阵重塑为矩形矩阵

通常,在处理不同行的不同索引时,操作最终会作用于矩阵的展开版或展开版。”在处理一维数组时,“不规则”操作通常比处理二维数组更有意义


更仔细地看一下您的示例,我发现当您删除一个项时,您会向上移动其他列值以填补空白。在我的版本中,我沿行移动值。让我们用F来试试这个

In [523]: mat2=mat.flatten('F')
In [524]: np.delete(mat2,idx2).reshape(5,4).T
Out[524]: 
array([[ 5,  1,  2,  3,  4],
       [10,  6,  7, 13,  9],
       [15, 11, 12, 18, 14],
       [20, 16, 22, 23, 24]])
其中,我从每列中删除了一个值:

In [525]: mat2[idx2]
Out[525]: array([ 0, 21, 17,  8, 19])

当对扁平化的数据执行ops时,数据的列完整性似乎没有得到保留。我正在寻找一种向上移动的方法,即删除元素下面的所有内容。很抱歉造成混淆。使用
F
重新排序和转置,
np.delete
可以将值保留在列中(与我的示例中的行相反)。我不想插嘴,但IDE在[525]中生成的是什么:输入[525]:输出[525]我已经花了很多时间试图找到这样做的交互式窗口…设置sys.ps1和sys.ps2并不能在windows上实现。