Описание проблемы
Рассмотрим следующие два примера массивов:
arr = np.array([
[5.0, 2.0, 1.0, np.nan, np.nan],
[9.0, np.nan, np.nan, np.nan, 2.0],
[4.0, 7.0, 4.0, np.nan, np.nan],
[8.0, np.nan, np.nan, np.nan, np.nan],
[np.nan, np.nan, np.nan, np.nan, np.nan],
[np.nan, np.nan, np.nan, np.nan, 6.0]
])
amounts = np.array([
3,
1,
2,
3,
0,
5
])
Для каждой строки в массиве arr
Я хотел бы проверить, не являются ли первые X записей в строке неNaN
, но все остальные записи NaN
.Это количество X различно для каждой строки и задается массивом amounts
.
Таким образом, мой ожидаемый результат будет следующим логическим массивом:
array([ True, False, False, False, True, False])
Пробовал до сих пор
Мне удалось придумать следующий рабочий код:
result = []
for (row, amount) in zip(arr, amounts):
if (~np.isnan(row)[:amount]).all() and np.isnan(row)[amount:].all():
result.append(True)
else:
result.append(False)
result = np.array(result)
print(result)
Хотя этот код дает желаемый результат, я чувствую, что он все еще неэффективен.Я подозреваю, что возможен метод без каких-либо циклов for, но я пока не смог его найти.
Кто-нибудь сможет помочь найти полностью векторизованное решение этой проблемы?