Сбой расширенной индексации
У меня есть массив Numpy выглядит так:
a = np.array([[0.87, 1.10, 2.01, 0.81 , 0.64, 0. ],
[0.87, 1.10, 2.01, 0.81 , 0.64, 0. ],
[0.87, 1.10, 2.01, 0.81 , 0.64, 0. ],
[0.87, 1.10, 2.01, 0.81 , 0.64, 0. ],
[0.87, 1.10, 2.01, 0.81 , 0.64, 0. ],
[0.87, 1.10, 2.01, 0.81 , 0.64, 0. ]])
Мне нравится манипулировать этим, устанавливая "нижнюю левую" часть на ноль. Вместо того, чтобы проходить по строкам и столбцам, я хочу добиться этого с помощью индексации:
ix = np.array([[1, 1, 1, 1, 1, 1],
[0, 1, 1, 1, 1, 1],
[0, 0, 1, 1, 1, 1],
[0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1]])
тем не мение a[ix]
не доставляет то, что я ожидаю, как a[ix].shape
сейчас (6,6,6)
новое измерение было добавлено. Что мне нужно сделать, чтобы сохранить форму a
а со всеми нулями внизу слева?
2 ответа
Решение
Если вы не хотите беспокоиться о создании ix
вообще, то, что вы действительно просите, это верхний треугольник a
, который является методом numpy.triu
np.triu(a)
array([[0.87, 1.1 , 2.01, 0.81, 0.64, 0. ],
[0. , 1.1 , 2.01, 0.81, 0.64, 0. ],
[0. , 0. , 2.01, 0.81, 0.64, 0. ],
[0. , 0. , 0. , 0.81, 0.64, 0. ],
[0. , 0. , 0. , 0. , 0.64, 0. ],
[0. , 0. , 0. , 0. , 0. , 0. ]])
Вам не нужно расширенное индексирование для этой цели. Логическое индексирование будет более подходящим для того, что у вас есть:
a[~ix.astype(bool)] = 0
a
#array([[ 0.87, 1.1 , 2.01, 0.81, 0.64, 0. ],
# [ 0. , 1.1 , 2.01, 0.81, 0.64, 0. ],
# [ 0. , 0. , 2.01, 0.81, 0.64, 0. ],
# [ 0. , 0. , 0. , 0.81, 0.64, 0. ],
# [ 0. , 0. , 0. , 0. , 0.64, 0. ],
# [ 0. , 0. , 0. , 0. , 0. , 0. ]])