Сбой расширенной индексации - PullRequest
0 голосов
/ 31 октября 2018

У меня есть массив 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 ]

0 голосов
/ 31 октября 2018

Если вы вообще не хотите беспокоиться о создании 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.  ]])
0 голосов
/ 31 октября 2018

Для этой цели не требуется расширенная индексация. Логическое индексирование будет более подходящим для того, что у вас есть:

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.  ]])
...