如果我有像func(x,y)= cos(x)+ sen(y)+ x * y这样的随机函数,我怎样才能将它应用于2个数组中的所有元素对?
我找到了https://docs.scipy.org/doc/numpy/reference/generated/numpy.outer.html和 发现所有基本操作都有外部功能。但是如果我想用自定义函数来做呢?
想象一下array1是[1,2],array2是[3,4]而我想要应用的函数叫做f(float,float)
预期输出为
[f(1,3)f(1,4)
f(2,3)f(2,4)]
答案 0 :(得分:2)
只要你确保以正确广播的方式编写你的功能,你就可以做到
f(x_arr[:, None], y_arr)
将其应用于两个一维数组x_arr
和y_arr
中的所有元素对。
例如,要以广播方式编写示例函数,请将其写为
def func(x, y):
return np.cos(x) + np.sin(y) + x*y
自np.cos
,np.sin
,+
和*
跨数组进行广播和向量化。
至于它是否播出?好吧,有些人可能会建议np.vectorize
,但是你需要记住很多棘手的事情,比如保持一致的输出dtype而不是副作用。如果您的功能没有广播,我建议您只使用列表推导:
np.array([[f(xval, yval) for yval in y_arr] for xval in x_arr])
答案 1 :(得分:0)
解决此问题的一种方法是广播:
import numpy as np
def func(x, y):
x, y = np.asarray(x)[:, None], np.asarray(y)
return np.cos(x) + np.sin(y) + x*y
[:, None]
为数组添加了另一个维度,因此会触发NumPys broadcasting。
>>> func([1,2], [3,4])
array([[ 3.68142231, 3.78349981],
[ 5.72497317, 6.82705067]])
答案 2 :(得分:0)
您可以使用嵌套循环执行此操作。在一个数组中使用单个元素,遍历另一个数组中的所有元素,然后继续执行第一个数组中的下一个元素并重复。
如果您只想打印结果,这将很简单,如果您想将结果存储到另一个数组中,这仍然有效,它只使用了大量资源。