Сбой расширенной индексации

У меня есть массив 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.  ]])
Другие вопросы по тегам