删除零线2-D numpy数组

Mil*_*ell 30 python numpy multidimensional-array

我跑qr factorizationnumpy它返回一个列表ndarrays,分别是QR:

>>> [q,r] = np.linalg.qr(np.array([1,0,0,0,1,1,1,1,1]).reshape(3,3))
Run Code Online (Sandbox Code Playgroud)

R 是一个二维数组,在底部有零线(甚至证明了我的测试集中的所有例子):

>>> print r
[[ 1.41421356  0.70710678  0.70710678]
 [ 0.          1.22474487  1.22474487]
 [ 0.          0.          0.        ]]
Run Code Online (Sandbox Code Playgroud)

.现在,我想分成R两个矩阵R_~:

[[ 1.41421356  0.70710678  0.70710678]
 [ 0.          1.22474487  1.22474487]]
Run Code Online (Sandbox Code Playgroud)

并且R_0:

[[ 0.          0.          0.        ]]
Run Code Online (Sandbox Code Playgroud)

(提取所有零线).它似乎接近这个解决方案:删除numpy数组中的行.

编辑:
更有趣:np.linalg.qr()返回一个n x n矩阵.不,我本来期望的:

A := n x m
Q := n x m
R := n x m
Run Code Online (Sandbox Code Playgroud)

eca*_*mur 66

使用np.all带有axis参数:

>>> r[np.all(r == 0, axis=1)]
array([[ 0.,  0.,  0.]])
>>> r[~np.all(r == 0, axis=1)]
array([[-1.41421356, -0.70710678, -0.70710678],
       [ 0.        , -1.22474487, -1.22474487]])
Run Code Online (Sandbox Code Playgroud)

  • @denfromufa哦是的,你需要在1轴上做下标:`r [:,np.all(r == 0,axis = 0)]` (11认同)
  • 很明显,有问题的是这个过滤不能像'axis = 0'那样应用,而是转置是必要的 (3认同)

HYR*_*YRY 5

因为数据并不完全等于零,所以我们需要设置一个零阈值,例如 1e-6,使用 numpy.all 和 axis=1 来检查行是否为零。使用 numpy.where 和 numpy.diff 获取分割位置,并调用 numpy.split 将数组分割为数组列表。

import numpy as np
[q,r] = np.linalg.qr(np.array([1,0,0,0,1,1,1,1,1]).reshape(3,3))
mask = np.all(np.abs(r) < 1e-6, axis=1)
pos = np.where(np.diff(mask))[0] + 1
result = np.split(r, pos)
Run Code Online (Sandbox Code Playgroud)


y-s*_*een 5

由于这是修剪零线二维数组的第一个谷歌结果之一,我想添加我的实现以仅删除二维中的前导零和尾随零:

p = np.where(t != 0)
t = t[min(p[0]) : max(p[0]) + 1, min(p[1]) : max(p[1]) + 1]
Run Code Online (Sandbox Code Playgroud)

这假设您的数组被调用t并且 numpy 被导入为np.