#python #numpy
Вопрос:
Я создал два массива numpy 1D
x1 = np.linspace(0, 1, 5)
x2 = np.linspace(0, 10, 5)
Я написал функцию
def myfoo(x1,x2):
return x1**2 x1*x2 x2**2
Чтобы получить 2D массив numpy, я использую следующий код :
y=np.empty((x1.size,x2.size))
for a in range(0,x2.size):
y[a]=myfoo(x1,x2[a])
Я хотел бы знать, можно ли написать функцию, которая выводит этот 2D-массив НАПРЯМУЮ. Мне просто интересно, можно ли написать y=myfoo2(x1,x2)
вместо трех строк кода, как указано выше.
Я знаю, что могу вставить эти строки в функцию, как предложено в комментарии. Но мне интересно, существует ли это в Numpy или Python «что-то» (функция, операторы,…), например, математическое двоичное произведение двух векторов (т. Е. Из двух 1D векторов размера m, n, эта операция дает матрицу размера m x n)
Спасибо за ответ
Комментарии:
1. Почему бы просто не определить рассматриваемые строки как функцию, которая возвращает 2D-массив, и не вызвать ее из другого места в вашем коде?
2. @esqew. На самом деле это не проблема. Это любопытство. Я знаю, что можно написать
y=myfoo(x1,x2)
, где x1, x2 и y являются 1D массивами иmyfoo(x1,x2): .. return x2**2 3*x1
, например. Поэтому мне интересно, есть ли синтаксис, позволяющий сделать что-то подобное с 2D-массивами.3.
myfoo(x1[:,None], x2)
.x1[:,None]*x2
создает массив (5,5). Ключевое слово здесьbroadcasting
. Какnumpy
пользователи, которые должны стать второй натурой!4. @hpaulj. Большое спасибо за ответ. По крайней мере, хороший ответ !!! Я читал эти темы : вещание, ufunc,векторизация … и проблема
for
цикла с точки зрения производительности, как я сделал в своем вопросе. У вас есть какие-нибудь ссылки, чтобы посоветовать мне ?5. @esqew. Если позволите, посмотрите на ответ hpaulj.
Ответ №1:
myfoo(x1[:,None], x2). x1[:,None]*x2
создает массив (5,5).
Комментарии:
1. Большое спасибо за ответ. Замечательно, что в фонкциях нечего менять. Даже я протестировал производительность на более сложных примерах,
%timeit
и производительность стала лучше. Идеальный ответ.