拆分数字并分配给numpy数组中的行中的元素

时间:2016-12-22 12:52:46

标签: numpy vectorization

如何将数字列表放入2D numpy数组中,其中数组的第二个维度等于该列表中最大数字的位数?我还希望不属于原始数字的元素在返回数组的每一行中都为零。

示例:

从列表a = range(0,1001),如何获取以下形式的numpy数组:

[[0,0,0,0],
 [0,0,0,1],
 [0,0,0,2],
 ...
 [0,9,9,8]
 [0,9,9,9],
 [1,0,0,0]]

请注意每个数字如何放置在每行末尾的np.zeros((1000,4))数组中。

NB :预计会出现pythonic,矢量化实现

2 个答案:

答案 0 :(得分:2)

再次

Broadcasting

def split_digits(a):
    N = int(np.log10(np.max(a))+1) # No. of digits
    r = 10**np.arange(N,-1,-1)  # 10-powered range array
    return (np.asarray(a)[:,None]%r[:-1])//r[1:]

样品运行 -

In [224]: a = range(0,1001)

In [225]: split_digits(a)
Out[225]: 
array([[0, 0, 0, 0],
       [0, 0, 0, 1],
       [0, 0, 0, 2],
       ..., 
       [0, 9, 9, 8],
       [0, 9, 9, 9],
       [1, 0, 0, 0]])

In [229]: a = np.random.randint(0,1000000,(7))

In [230]: a
Out[230]: array([431921, 871855, 636144, 541186, 410562,  89356, 476258])

In [231]: split_digits(a)
Out[231]: 
array([[4, 3, 1, 9, 2, 1],
       [8, 7, 1, 8, 5, 5],
       [6, 3, 6, 1, 4, 4],
       [5, 4, 1, 1, 8, 6],
       [4, 1, 0, 5, 6, 2],
       [0, 8, 9, 3, 5, 6],
       [4, 7, 6, 2, 5, 8]])

答案 1 :(得分:2)

使用pandas str

的另一个概念
def pir(a):
    z = int(np.log10(np.max(a)))
    s = pd.Series(a.astype(str))
    zfilled = s.str.zfill(z + 1).sum()
    a_ = np.array(list(zfilled)).reshape(-1, z + 1)
    return a_.astype(int)

使用@Divakar的随机数组

a = np.random.randint(0,1000000,(7))

array([ 57190,  29950, 392317, 592062, 460333, 639794, 983647])

pir(a)

array([[0, 5, 7, 1, 9, 0],
       [0, 2, 9, 9, 5, 0],
       [3, 9, 2, 3, 1, 7],
       [5, 9, 2, 0, 6, 2],
       [4, 6, 0, 3, 3, 3],
       [6, 3, 9, 7, 9, 4],
       [9, 8, 3, 6, 4, 7]])