【问题标题】:Splitting a number and assigning to elements in a row in a numpy array拆分数字并分配给numpy数组中一行中的元素
【发布时间】:2017-05-08 02:33:59
【问题描述】:

如何将数字列表放入 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:预计会有 Python 式的矢量化实现

【问题讨论】:

    标签: numpy vectorization


    【解决方案1】:

    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]])
    

    【讨论】:

    • 再次感谢!这很漂亮。
    【解决方案2】:

    另一个使用pandasstr的概念

    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]])
    

    【讨论】:

    • 您可能想使用np.max()等,因为输入可能是一个列表。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2021-12-12
    • 2016-07-21
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2019-08-28
    相关资源
    最近更新 更多