Как написать функцию, которая НАПРЯМУЮ выводит 2D массив Numpy из двух 1D массивов?

#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 и производительность стала лучше. Идеальный ответ.