我正在尝试规范化numpy数组x的每一行向量,但我遇到了2个问题。
是否可以避免使用任何numpy函数的for循环(第6行)?
import numpy as np
x = np.array([[0, 3, 4] , [1, 6, 4]])
c = x ** 2
for i in range(0, len(x)):
print(x[i]/np.sqrt(c[i].sum())) #prints [0. 0.6 0.8]
x[i] = x[i]/np.sqrt(c[i].sum())
print(x[i]) #prints [0 0 0]
print(x) #prints [[0 0 0] [0 0 0]] and wasn't updated
我刚刚开始使用numpy,所以非常感谢任何帮助!
答案 0 :(得分:2)
- 我无法更新x的行向量(图片中的源代码)
醇>
您的services.kubernetes.roles = ["master" "node"];
没有np.array
参数,因此它使用dtype
。如果您希望在数组中存储浮点数,请添加<type 'numpy.int32'>
:
float dtype
要看到这一点,请比较
x = np.array([
[0,3,4],
[1,6,4]
], dtype = np.float)
到
x = np.array([
[0,3,4],
[1,6,4]
], dtype = np.float)
print type(x[0][0]) # output = <type 'numpy.float64'>
是否可以避免使用任何numpy函数的for循环(第6行)?
我就是这样做的:
x = np.array([
[0,3,4],
[1,6,4]
])
print type(x[0][0]) # output = <type 'numpy.int32'>
答案 1 :(得分:2)
您可以使用:
x/np.sqrt((x*x).sum(axis=1))[:, None]
示例:
In [9]: x = np.array([[0, 3, 4] , [1, 6, 4]])
In [10]: x/np.sqrt((x*x).sum(axis=1))[:, None]
Out[10]:
array([[0. , 0.6 , 0.8 ],
[0.13736056, 0.82416338, 0.54944226]])
答案 2 :(得分:1)
对于第一个问题:
x = np.array([[0,3,4],[1,6,4]],dtype=np.float32)
关于第二个问题:
x/np.sqrt(np.sum(x**2,axis=1).reshape((len(x),1)))
答案 3 :(得分:0)
给定二维数组
x = np.array([[0, 3, 4] , [1, 6, 4]])
该阵列的行式L2范数可以用以下公式计算:
norm = np.linalg.norm(x, axis = 1)
print(norm)
[5. 7.28010989]
你不能将形状(2,3)的数组x除以形状(2,)的范数,下面的技巧可以通过在规范中添加额外的维度来实现
# Divide by adding extra dimension
x = x / norm[:, None]
print(x)
[[0. 0.6 0.8 ]
[0.13736056 0.82416338 0.54944226]]
这解决了你的两个问题