Ответ 1
Используйте 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]])
Я запустил qr factorization
в numpy
, который возвращает список ndarrays
, а именно Q
и R
:
>>> [q,r] = np.linalg.qr(np.array([1,0,0,0,1,1,1,1,1]).reshape(3,3))
R
- это двумерный массив, имеющий пониженные линии внизу (даже доказанные для всех примеров в моем тестовом наборе):
>>> print r
[[ 1.41421356 0.70710678 0.70710678]
[ 0. 1.22474487 1.22474487]
[ 0. 0. 0. ]]
. Теперь я хочу разделить R
на две матрицы R_~
:
[[ 1.41421356 0.70710678 0.70710678]
[ 0. 1.22474487 1.22474487]]
и R_0
:
[[ 0. 0. 0. ]]
(извлечение всех нулевых строк). Это похоже на это решение: удаление строк в массиве numpy.
EDIT:
Еще интереснее: np.linalg.qr()
возвращает a n x n
-матрицу. Не, чего бы я ожидал:
A := n x m
Q := n x m
R := n x m
Используйте 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]])
Поскольку данные не равны нулю точно, нам нужно установить пороговое значение для нуля, например 1е-6, использовать numpy.all с осью = 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)
Если вы хотите исключить строки с незначительными записями, я бы использовал 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,:]