Как рассчитать многомерный массив с трансляцией? - PullRequest
0 голосов
/ 26 февраля 2019

Я рассчитал элементы по двойной петле for следующим образом.

N,l=20,10
a=np.random.rand(N,l)
b=np.random.rand(N,l)
r=np.zeros((N,N,l))

for i in range(N):
    for j in range(N):
        r[i,j]=a[i]*a[j]*(b[i]-b[j])-a[i]/a[j]

Вопрос:

  1. Как векторизовать массив и рассчитать его с помощью широковещания?

  2. Я также хочу установить индекс i не равный j, что означает оставить диагональный элемент равным нулю.Могу ли я сделать это также с помощью векторизации?

1 Ответ

0 голосов
/ 26 февраля 2019

Вы можете транслировать всю арифметику и удалить петли.

r2 = (a[:,None]*a) * (b[:,None]-b) - (a[:,None]/a)

# Verify the correctness
np.array_equal(r, r2)
# True

Наконец, чтобы установить нулевые диагонали, либо используйте назначение на месте

r2[(np.arange(N),)*2] = 0

Или,numpy.fill_diagonal, который также заполняет на месте.

np.fill_diagonal(r2, 0)
...