是否可以从函数构造numpy
矩阵?在这种情况下,具体而言,函数是两个向量的绝对差值:S[i,j] = abs(A[i] - B[j])
。一个使用常规python的最小工作示例:
import numpy as np
A = np.array([1,3,6])
B = np.array([2,4,6])
S = np.zeros((3,3))
for i,x in enumerate(A):
for j,y in enumerate(B):
S[i,j] = abs(x-y)
,并提供:
[[ 1. 3. 5.]
[ 1. 1. 3.]
[ 4. 2. 0.]]
如果结构看起来像是这样的话会很好:
def build_matrix(shape, input_function, *args)
我可以使用它的参数传递输入函数并保持numpy的速度优势。
答案 0 :(得分:16)
除了@JoshAdel建议的内容之外,您还可以使用任何numpy ufunc
的{{3}}来进行两个阵列的广播。
在这种情况下,您只需np.subtract.outer(A, B)
(或者更确切地说,它的绝对值)。
虽然这个例子中任何一个都是可读的,但在某些情况下广播更有用,而在其他情况下使用ufunc方法则更清晰。
无论哪种方式,了解这两种技巧都很有用。
E.g。
import numpy as np
A = np.array([1,3,6])
B = np.array([2,4,6])
diff = np.subtract.outer(A, B)
result = np.abs(diff)
基本上,您可以将outer
,accumulate
,reduce
和reduceat
与ufunc
,{subtract
等multiply
divide
一起使用1}},logical_and
,甚至是np.cumsum
等等。
例如,np.add.accumulate
相当于cumdiv
。这意味着,如果您需要,可以按np.divide.accumulate
实现{{1}}之类的内容。
答案 1 :(得分:12)
我建议看一下numpy的广播功能:
In [6]: np.abs(A[:,np.newaxis] - B)
Out[6]:
array([[1, 3, 5],
[1, 1, 3],
[4, 2, 0]])
http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
然后你可以简单地将你的函数编写为:
In [7]: def build_matrix(func,args):
...: return func(*args)
...:
In [8]: def f1(A,B):
...: return np.abs(A[:,np.newaxis] - B)
...:
In [9]: build_matrix(f1,(A,B))
Out[9]:
array([[1, 3, 5],
[1, 1, 3],
[4, 2, 0]])
这也应该比大型阵列的解决方案快得多。