Как рассчитать многомерный массив с вещанием?

Я вычислил элементы двойным циклом 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. Я также хочу установить индекс inot equalsj, что означает оставить диагональный элемент равным нулю. Могу ли я сделать это также с помощью векторизации?


person kinder chen    schedule 25.02.2019    source источник


Ответы (1)


Можно транслировать всю арифметику и убрать луп.с

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)
person cs95    schedule 26.02.2019
comment
Спасибо, есть ли способ сохранить исходное значение диагональных элементов равным 0? - person kinder chen; 26.02.2019
comment
@kinderchen Не уверен, что ты имеешь в виду? Кажется, это дает тот же результат, что и ваш текущий код. - person cs95; 26.02.2019
comment
Да, мне просто интересно, возможно ли, чтобы диагональный элемент тоже оставался нулевым. - person kinder chen; 26.02.2019
comment
@kinderchen Используйте np.fill_diagonal(r2, 0) - person cs95; 26.02.2019
comment
@coldspeed, не могли бы вы помочь со следующим вопросом " title="как объединить CSV-файлы с разными заголовками, но одинаковыми данными при условии"> stackoverflow.com/questions/54865312/ - person panda; 26.02.2019