给定一个数组,我想将其标准化,使每行总和为1。
我目前有以下代码:
import numpy
w = numpy.array([[0, 1, 0, 1, 0, 0],
[1, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 0],
[0, 0, 0, 1, 0, 1],
[0, 1, 1, 0, 1, 0]], dtype = float)
def rownormalize(array):
i = 0
for row in array:
array[i,:] = array[i,:]/sum(row)
i += 1
我有两个问题:
1)代码有效,但我想知道是否有更优雅的方式。
2)如果数据类型为int,我如何将数据类型转换为浮点数?我试过了
if array.dtype == int:
array.dtype = float
但它没有用。
答案 0 :(得分:7)
你可以这样做1):
array /= array.sum(axis=1, keepdims=True)
和2)就像那样:
array = array.astype(float)
答案 1 :(得分:4)
尽管broadcasted
所有元素的划分可能很昂贵。关注性能的替代方案是预先计算行求和的倒数,并使用它们来执行broadcasted
乘法,如此 -
w *= 1.0/w.sum(1,keepdims=1)
运行时测试 -
In [588]: w = np.random.rand(3000,3000)
In [589]: out1 = w/w.sum(axis=1, keepdims=True) #@Julien Bernu's soln
In [590]: out2 = w*(1.0/w.sum(1,keepdims=1))
In [591]: np.allclose(out1,out2)
Out[591]: True
In [592]: %timeit w/w.sum(axis=1, keepdims=True) #@Julien Bernu's soln
10 loops, best of 3: 66.7 ms per loop
In [593]: %timeit w*(1.0/w.sum(1,keepdims=1))
10 loops, best of 3: 40 ms per loop