规范化numpy数组

时间:2016-11-13 21:03:01

标签: python numpy vectorization

给定一个数组,我想将其标准化,使每行总和为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

但它没有用。

2 个答案:

答案 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
相关问题