Python 3.x 将numpy矩阵的每个元素除以该行的单位向量

Python 3.x 将numpy矩阵的每个元素除以该行的单位向量,python-3.x,numpy,Python 3.x,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 但当我在很大的矩阵上使用此代码时,它会抛出以下错误:

如何将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:在true_divide中遇到无效值”。但我的numpy“A”数组中没有任何无效值。我使用“argwhere”检查进行检查。它总是返回一个空列表。这是一个矩阵有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。其中
我们在两个选项中进行选择,语法为:

np.where(condition, option1, option2)
要避免任何警告并将结果写回输入,请使用掩码-

mask = ~np.isclose(dists,0).ravel()
A[mask] /= dists[mask]
说明:对于布尔数组中的每个数组元素
条件
,它将在两个数组中的相应元素
选项1
选项2
之间进行选择。在我们的例子中,如果使用
np.isclose
检测到
dists
元素接近零,则表示该行中的所有元素都是与该
dists
值对应的零。因此,本质上,如果
条件
,我们将
0
指定为输出,否则选择计算的
dist
值作为输出


使用
np.sum
np.einsum
获得性能的
dist
的替代方案很少-

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)
沿第二轴计算平方和
和减少。它的其余部分只是
平方根
,并添加一个带有
[:,None]
的新轴,用于对齐和以后针对
a的分割

后面的
sum
方法基本上是
squaring
sum
np.sum
沿着第二个轴。其余部分与einsum相同,这里有一种方法-

from __future__ import division

dists = np.linalg.norm(A,axis=1,keepdims=1)
out = np.where(np.isclose(dists,0), 0, A/dists)
基本上,对于
np。其中
我们在两个选项中进行选择,语法为:

np.where(condition, option1, option2)
要避免任何警告并将结果写回输入,请使用掩码-

mask = ~np.isclose(dists,0).ravel()
A[mask] /= dists[mask]
说明:对于布尔数组中的每个数组元素
条件
,它将在两个数组中的相应元素
选项1
选项2
之间进行选择。在我们的例子中,如果使用
np.isclose
检测到
dists
元素接近零,则表示该行中的所有元素都是与该
dists
值对应的零。因此,本质上,如果
条件
,我们将
0
指定为输出,否则选择计算的
dist
值作为输出


使用
np.sum
np.einsum
获得性能的
dist
的替代方案很少-

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)
沿第二轴计算平方和
和减少。它的其余部分只是
平方根
,并添加一个带有
[:,None]
的新轴,用于对齐和以后针对
a的分割


后面的
sum
方法基本上是
squaring
sum
np.sum
沿着第二个轴。其余部分与
einsum

相同,你能告诉我为什么它会给我这个警告吗?@NikitaGupta可能是因为你在除以
0
。输入数组的数据类型是什么?@NikitaGupta我认为这是因为您有一个零值元素,
norm
值也是
0
。所以,对于
0/0
除法,它可能会发出警告。A=csc_matrix((10028102),dtype=np.longdouble)。toarray()稍后我会用一些值填充A中的一些索引。你能告诉我为什么它会给我这个警告吗?@NikitaGupta可能是因为你在用
0
除法。输入数组的数据类型是什么?@NikitaGupta我认为这是因为您有一个零值元素,
norm
值也是
0
。因此,对于
0/0
除法,它可能会抛出警告。A=csc_matrix((10028102),dtype=np.longdouble)。toarray()稍后我将用一些值填充A中的一些索引。