Из-за размера ваших матриц и требований вашей проблемы я думаю, что итерация неизбежна. Вы не можете использовать вещание, так как оно взорвет вашу память, поэтому вам нужно работать с существующим массивом построчно. Однако вы можете использовать numba
и njit
, чтобы значительно ускорить это по сравнению с подходом на чистом Python.
import numpy as np
from numba import njit
@njit
def zero_out_contained_rows(a):
"""
Finds rows where all of the elements are
equal or smaller than all corresponding
elements of anothe row, and sets all
values in the row to zero
Parameters
----------
a: ndarray
The array to modify
Returns
-------
The modified array
Examples
--------
>>> zero_out_contained_rows(np.array([[1, 0, 1], [0, 1, 0], [1, 0, 0]]))
array([[1, 0, 1],
[0, 1, 0],
[0, 0, 0]])
"""
x, y = a.shape
contained = np.zeros(x, dtype=np.bool_)
for i in range(x):
for j in range(x):
if i != j and not contained[j]:
equal = True
for k in range(y):
if a[i, k] < a[j, k]:
equal = False
break
contained[j] = equal
a[contained] = 0
return a
Это ведет к постоянному подсчету того, используется ли строка в другой строке. Это предотвращает множество ненужных сравнений за счет короткого замыкания, прежде чем, наконец, стереть строки, содержащиеся в других, с помощью 0
.
По сравнению с вашей первоначальной попыткой использовать итерацию, это улучшение скорости, а также обнуление правильных строк.
a = np.random.randint(0, 2, (6000, 6000))
%timeit zero_out_contained_rows(a)
1.19 s ± 1.87 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Я обновлю тайминги, как только ваша попытка завершится (в настоящее время ~ 10 минут).
person
user3483203
schedule
01.05.2019
np.triu_indices
и проверьте этот stackoverflow.com/questions/52690963/ - person kvitaliy   schedule 01.05.2019broadcasting
. Вы можете попробовать(a >= a[:, None]).all(-1)
, но это быстро взорвет вашу память большими массивами. - person user3483203   schedule 01.05.2019x
, которая покрывает всех потребителей, которые покрывает какая-то другая электростанцияy
и, возможно, больше, то станцияy
не требуется. - person randomprime   schedule 01.05.2019