将计数数据数组转换为1和0的矩阵

时间:2015-08-12 15:31:40

标签: python numpy

我有一个数组n的计数数据,我想把它转换成一个矩阵x,其中每一行包含一些等于相应计数的数字,用零填充,例如:

n = [0 1 3 0 1]

x = [[ 0.  0.  0.]
     [ 1.  0.  0.]
     [ 1.  1.  1.]
     [ 0.  0.  0.]
     [ 1.  0.  0.]]

我的解决方案如下,而且非常慢。有可能做得更好吗?

n = np.random.poisson(2,5)
max_n = max(n)

def f(y):
    return np.concatenate((np.ones(y), np.zeros(max_n-y)))

x = np.vstack(map(f,n))

2 个答案:

答案 0 :(得分:3)

以下是对其进行矢量化的一种方法:

>>> n = np.array([0,2,1,0,3])
>>> width = 4
>>> (np.arange(width) < n[:,None]).astype(int)
array([[0, 0, 0, 0],
       [1, 1, 0, 0],
       [1, 0, 0, 0],
       [0, 0, 0, 0],
       [1, 1, 1, 0]])

如果您愿意,width可能是max(n)或您选择的任何其他内容。

答案 1 :(得分:2)

import numpy as np
n = np.array([0, 1, 3, 0, 1])
max_n = max(n)
np.vstack(n > i for i in range(max_n)).T.astype(int) # xrange(max_n) for python 2.x

输出:

array([[0, 0, 0],
       [1, 0, 0],
       [1, 1, 1],
       [0, 0, 0],
       [1, 0, 0]])