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