2017-02-19 24 views
0

Я пытаюсь решить проблему, используя многомерные массивы, вместо того, чтобы прибегать к циклам for, чтобы получить повышение производительности, но у меня возникают проблемы с индексированием.Треугольное индексирование и выбор оси суммирования для многомерных массивов/матриц

Я пробовал различные перестановки с использованием np.newaxis, но, похоже, не может выполнять следующие функции.

Проблема:

Часть 1) Возьмут М х N х N массив называется a, и для каждого из квадратных матриц М, установить верхние треугольную матрицу элементы, как их отрицательных значения.

часть 2) Суммировать все элементы в каждой из матриц M (формы N X N), возвращая 1D массив с M элементами. Назовем этот массив b.

Покушение Решение

Вот мой МРД/попытка с помощью петли (которая делает работу, но я предпочел бы найти полностью массив/матрица на основе подхода

a = np.array(
     [[[ 0, 1], 
     [ 5, 0]], 

     [[ 0, 3], 
     [ 2, 0]]]) 

Часть 1):

triangular_upper_idx = np.triu_indices_from(a[0]) 
for i in range(len(a)): 
    a[i][triangular_upper_idx] *= -1 
a 

результат:

array([[[ 0, -1], 
     [ 5, 0]], 

     [[ 0, -3], 
     [ 2, 0]]]) 

Часть 2):

b = np.zeros(len(a)) 
for i in range(len(a)): 
    b[i] = np.sum(a[i]) 
b 

результат:

array([ 4., -1.]) 

Примечание: Я видел подобный вопрос по этой теме (Triangular indices for multidimensional arrays in numpy), но решение было вложено для петель ... Я чувствуете, что numpy может предложить более эффективное, умное решение на базе массива?

Любое руководство будет высоко оценено.

Благодаря

ответ

1

да NumPy есть инструменты

r = 2 

neg_uppr = np.triu(-np.ones((r,r)),1) + np.tril(np.ones((r,r))) 

не могу сказать от вашего численного примера, если вы хотите диагональ инвертировать тоже? Затем используйте np.triu(-np.ones((r,r))) + np.tril(np.ones((r,r)),-1)

neg_uppr 
Out[23]: 
array([[ 1., -1.], 
     [ 1., 1.]]) 

a = np.array(
     [[[ 0, 1], 
     [ 5, 0]], 

     [[ 0, 3], 
     [ 2, 0]]])  

его быстро использовать предопределённую поэлементны арифметике

a = a * neg_uppr 

a 
Out[26]: 
array([[[ 0., -1.], 
     [ 5., 0.]], 

     [[ 0., -3.], 
     [ 2., 0.]]])  

Вы можете задать ось просуммировать:

np.sum(a, (1,2)) 
Out[27]: array([ 4., -1.]) 
+0

Совершенного спасибо. Я не понял, что np.sum может иметь аргумент массива для своей оси. Это отлично работает. – IanRoberts

 Смежные вопросы

  • Нет связанных вопросов^_^