41

のリストを返すを実行しqr factorizationます。つまり、:numpyndarraysQR

>>> [q,r] = np.linalg.qr(np.array([1,0,0,0,1,1,1,1,1]).reshape(3,3))

Rは2次元配列であり、下部にゼロラインがピボットされています(私のテストセットのすべての例で証明されています)。

>>> print r
[[ 1.41421356  0.70710678  0.70710678]
 [ 0.          1.22474487  1.22474487]
 [ 0.          0.          0.        ]]

R今、私は2つの行列に分割したいと思いますR_~

[[ 1.41421356  0.70710678  0.70710678]
 [ 0.          1.22474487  1.22474487]]

およびR_0

[[ 0.          0.          0.        ]]

(すべてのゼロラインを抽出します)。この解決策に近いようです:numpy配列の行を削除します

編集:
さらに興味深い:-行列をnp.linalg.qr()返しますn x n。そうではなく、私が期待していたこと:

A := n x m
Q := n x m
R := n x m
4

4 に答える 4

96

引数とともに使用np.allaxisます:

>>> 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]])
于 2012-06-25T11:59:49.787 に答える
3

データは正確にゼロに等しくないため、1e-6などのゼロのしきい値を設定する必要があります。行がゼロかどうかを確認するには、axis=1でnumpy.allを使用します。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)
于 2012-06-25T12:02:54.250 に答える
3

これは、ゼロラインの2D配列をトリミングした最初のグーグルの結果の1つであるため、2次元で先頭と末尾のゼロのみを削除する実装を追加したいと思います。

p = np.where(t != 0)
t = t[min(p[0]) : max(p[0]) + 1, min(p[1]) : max(p[1]) + 1]

これは、配列が呼び出されt、numpyがとしてインポートされることを前提としていますnp

于 2021-01-19T19:44:37.533 に答える
2

エントリが無視できる行を削除したい場合は、を使用しますnp.allclose

zero_row_indices = [i for i in r.shape[0] if np.allclose(r[i,:],0)]
nonzero_row_indices =[i for i in r.shape[0] if not np.allclose(r[i,:],0)]
r_new = r[nonzero_row_indices,:]
于 2017-05-01T13:54:10.323 に答える