2017-04-12 330 views
1

如何用该行的单位向量划分numpy数组的每个行元素?将numpy矩阵的每个元素除以该行的单位向量

对于例如:

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

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

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

我通过使用下面的片段而获得的:

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

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

回答

0

这里有一个方法 -

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] 

说明on:对于布尔数组condition中的每个数组元素,它将在两个数组option1option2中的相应元素之间进行选择。在我们的例子中,如果使用np.isclose检测到dists元素接近于零,这表示该行中的所有元素都是与该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基本计算平方而且随着np.einsum('ij,ij->i',A,A)第二轴sum-reduction。其余的只是square-root,并添加一个新的轴与[:,None]对齐和后来的分裂对A

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

+0

你能告诉我为什么它给了我这个警告吗? –

+0

@NikitaGupta可能因为你被'0'分隔。输入数组的数据类型是什么? – Divakar

+0

@NikitaGupta我认为它是因为你有一个零值元素,'norm'值也是'0'。所以,对于那个'0/0'分区,它可能会抛出这个警告。 – Divakar

相关问题