首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从两个Numpy数组高效地生成Cauchy矩阵

从两个Numpy数组高效地生成Cauchy矩阵
EN

Stack Overflow用户
提问于 2014-01-29 18:03:46
回答 2查看 1.6K关注 0票数 1

柯西矩阵(Wikipedia article)是由两个向量(数组)确定的矩阵。给定两个向量xy,由它们生成的柯西矩阵C按条目定义为

代码语言:javascript
复制
C[i][j] := 1/(x[i] - y[j])

给定两个块状数组xy,什么是生成柯西矩阵的有效方法?

EN

回答 2

Stack Overflow用户

发布于 2014-01-29 18:03:46

这是我发现的最有效的方法,使用数组广播来利用矢量化。

代码语言:javascript
复制
1.0 / (x.reshape((-1,1)) - y)

编辑:@HYRY和@shx2建议您可以使用x[:,np.newaxis],它返回同一数组的视图,而不是生成副本的x.reshape((-1,1))。@HYRY还建议使用1.0/np.subtract.outer(x,y),它对我来说稍微慢一些,但可能更明确。

示例:

代码语言:javascript
复制
>>> x = numpy.array([1,2,3,4]) #x
>>> y = numpy.array([5,6,7])   #y
>>>
>>> #transpose x, to nx1
... x = x.reshape((-1,1))
>>> x
array([[1],
       [2],
       [3],
       [4]])
>>>
>>> #array of differences x[i] - y[j]
... #an nx1 array minus a 1xm array is an nxm array
... diff_matrix = x-y
>>> diff_matrix
array([[-4, -5, -6],
       [-3, -4, -5],
       [-2, -3, -4],
       [-1, -2, -3]])
>>>
>>> #apply the multiplicative inverse to each entry
... cauchym = 1.0/diff_matrix
>>> cauchym
array([[-0.25      , -0.2       , -0.16666667],
       [-0.33333333, -0.25      , -0.2       ],
       [-0.5       , -0.33333333, -0.25      ],
       [-1.        , -0.5       , -0.33333333]])

我尝试了其他一些方法,所有这些方法都要慢得多。

这是一种天真的方法,它耗费了列表理解的成本:

代码语言:javascript
复制
cauchym = numpy.array([[ 1.0/(x_i-y_j) for y_j in y] for x_i in x])

这个函数将矩阵生成为一维数组(节省了嵌套Python列表的成本),然后将其重塑为矩阵。它还将除法移动到单个Numpy操作:

代码语言:javascript
复制
cauchym = 1.0/numpy.array([(x_i-y_j) for x_i in x for y_j in y]).reshape([len(x),len(y)])

使用numpy.repeatnumpy.tile (分别水平和垂直平铺数组)。这种方式制作了不必要的副本:

代码语言:javascript
复制
lenx = len(x)
leny = len(y)
xm = numpy.repeat(x,leny) #the i'th row is s_i
ym = numpy.tile(y,lenx)
cauchym = (1.0/(xm-ym)).reshape([lenx,leny]);
票数 3
EN

Stack Overflow用户

发布于 2021-11-14 14:51:12

我创建了一个函数,希望它能帮助你更好地理解。

代码语言:javascript
复制
# Creating a function in order to form a cauchy matrix
def cauchy_matrix(arr1,arr2):
    """
    Enter two arrays in order to get a cauchy matrix.The input array should be a 1-D array.
    arr1 = First 1-D array
    arr2 = Second 1-D array
    It returns the cauchy matrix having shape equal to m*n, where m is size of arr1 and n is size of arr2.
    """
    my_list = []
    try:
        for i in range(len(arr1)):
            for j in range(len(arr2)):
                z = 1/(arr1[i]-arr2[j])
                my_list.append(z)

        return np.array(my_list).reshape(arr1.shape[0],arr2.shape[0])
    except ZeroDivisionError:
        print("Check if both the arrays has '0' as one of it's element. One array can have a zero but both the arrays having '0' is not acceptable!")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21427687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档