Цель
Учитывая двумерный массив A
, я должен продолжать добавлять +1 к значению первой строки в каждом столбце до тех пор, пока суммы столбцов не будут равны одному значению,например, 28.
Мое решение
Возможно, это не лучшее из решений, но, учитывая то, что я хотел бы высказать, оно подойдет.Это должно быть упрощенным примером.В исходной версии это основано на распределении вероятностей того, получает ли первая или вторая строка +1, и оно отличается среди столбцов.Кроме того, это должно быть сделано один за другим, поскольку распределение вероятностей изменяется в зависимости от того, получил ли первый или второй ряд столбца +1 в предыдущем цикле.Таким образом, суммирование столбцов и итерация необходимы.
import numpy as np
A = np.arange(20).reshape(2, 10)
print(A)
MASK = A.sum(axis=0) < 28
print(A.sum(axis=0) < 28)
while np.any(MASK):
LUCKYROW = np.repeat(0, np.count_nonzero(MASK))
A[LUCKYROW, MASK] += 1
MASK = A.sum(axis=0) < 28
print(A.sum(axis=0) < 28)
print(A)
Давайте посмотрим на вывод:
[[ 0 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18 19]]
[ True True True True True True True True True False]
[ True True True True True True True True True False]
[ True True True True True True True True False False]
[ True True True True True True True True False False]
[ True True True True True True True False False False]
[ True True True True True True True False False False]
[ True True True True True True False False False False]
[ True True True True True True False False False False]
[ True True True True True False False False False False]
[ True True True True True False False False False False]
[ True True True True False False False False False False]
[ True True True True False False False False False False]
[ True True True False False False False False False False]
[ True True True False False False False False False False]
[ True True False False False False False False False False]
[ True True False False False False False False False False]
[ True False False False False False False False False False]
[ True False False False False False False False False False]
[False False False False False False False False False False]
[[18 17 16 15 14 13 12 11 10 9]
[10 11 12 13 14 15 16 17 18 19]]
Хорошо, это работает, но почему я вычисляю сумму каждого столбцав каждом цикле?Основываясь на предыдущих циклах, я знаю, какая сумма столбца уже достигла целевого значения.Если я воспользуюсь этой информацией, я смогу сэкономить время.
Мое второе решение
import numpy as np
A = np.arange(20).reshape(2, 10)
print(A)
MASK = A.sum(axis=0) < 28
print(A.sum(axis=0) < 28)
while np.any(MASK):
LUCKYROW = np.repeat(0, np.count_nonzero(MASK))
A[LUCKYROW, MASK] += 1
MASK[MASK] = A[:, MASK].sum(axis=0) < 28
print(A[:, MASK].sum(axis=0) < 28)
print(A)
И вывод:
[[ 0 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18 19]]
[ True True True True True True True True True False]
[ True True True True True True True True True]
[ True True True True True True True True]
[ True True True True True True True True]
[ True True True True True True True]
[ True True True True True True True]
[ True True True True True True]
[ True True True True True True]
[ True True True True True]
[ True True True True True]
[ True True True True]
[ True True True True]
[ True True True]
[ True True True]
[ True True]
[ True True]
[ True]
[ True]
[]
[[18 17 16 15 14 13 12 11 10 9]
[10 11 12 13 14 15 16 17 18 19]]
Кажется, это работает.Хотя возникает одна проблема.Это не быстрее, чем первое решение.Я пробовал использовать 25000 столбцов и 74998 в качестве целевого значения, но они примерно равны по времени.
Мой запрос
Я думаю, что у меня может быть принципиальное недопонимание либо операций ndarray, либо индексации ndarray.Второе решение должно делать все меньше и меньше вычислений с каждым циклом, поэтому я ожидаю значительного улучшения производительности.Я не могу найти объяснение.Где мой ход мысли неисправен?