【问题标题】:Divide each element of numpy matrix by the unit vector of that row将numpy矩阵的每个元素除以该行的单位向量
【发布时间】:2017-04-12 20:49:54
【问题描述】:

numpy数组的每一行元素如何除以该行的单位向量?

例如:

A = np.array([[ 0. , 1.],[ 2.,  4.],[ 1.,  5.]])

所以,需要的输出矩阵应该是:

[[ 0.0 , 1.][0.0,   0.0][0.19611614 , 0.98058068]]

我通过使用以下 sn-p 获得了这个:

for row in A:
    t=np.sqrt(np.sum(row**2))
    row = row/t

但是当我在非常大的矩阵上使用此代码时,它会抛出以下错误: “RuntimeWarning:在 true_divide 中遇到无效值”。但是我的 numpy“A”数组中没有任何无效值。我使用“argwhere”检查进行了检查。它总是返回一个空列表。这个矩阵要么有 0,要么有一些值。我知道应该有一些更容易执行这个计算。请帮助。

【问题讨论】:

    标签: python-3.x numpy


    【解决方案1】:

    这是一种方法 -

    from __future__ import division
    
    dists = np.linalg.norm(A,axis=1,keepdims=1)
    out = np.where(np.isclose(dists,0), 0, A/dists)
    

    基本上,对于np.where,我们在两个选项之间进行选择,语法是:

    np.where(condition, option1, option2)
    

    为避免任何警告并将结果写回输入,请使用掩码 -

    mask = ~np.isclose(dists,0).ravel()
    A[mask] /= dists[mask]
    

    解释:对于布尔数组condition中的每个数组元素,它会在option1option2两个数组中的对应元素之间进行选择。在我们的例子中,如果dists 元素接近于零被np.isclose 检测到,这意味着该行中的所有元素都是对应于dists 值的零。因此,本质上,如果conditionzero,我们将分配0 作为输出,否则选择计算出的dist 值作为输出。


    获得distsnp.sumnp.einsum 以提高性能的选择很少 -

    np.sqrt(np.einsum('ij,ij->i',A,A))[:,None]
    np.sqrt((A**2).sum(1))[:,None]
    

    einsum 基本上计算平方和sum-reduction 沿第二个轴与np.einsum('ij,ij->i',A,A)。其余的只是square-root 并添加一个带有[:,None] 的新轴,用于对齐和以后针对A 的划分。

    sum后面的方法基本上是squaringsummingnp.sum沿第二个轴。其余部分与einsum 相同。

    【讨论】:

    • 你能告诉我为什么它给我这个警告吗?
    • @NikitaGupta 可能是因为你除以0。输入数组的数据类型是什么?
    • @NikitaGupta 我认为这是因为你有一个零值元素,norm 的值也是0。所以,对于那个0/0 部门,它可能会抛出那个警告。
    • A = csc_matrix((100,28102),dtype = np.longdouble).toarray()
    • 稍后我会用一些值填充 A 中的一些索引。
    猜你喜欢
    • 2019-03-28
    • 2013-11-05
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    相关资源
    最近更新 更多