首页 文章

numpy如何将数组更改为除最大值之外的零

提问于
浏览
1

我想创建一个函数,当它提供一个数组时,它返回一个相同形状的数组,但是所有零都期望1个值是最大值 . 例如 . 像这样的数组:

my_array = np.arange(9).reshape((3,3))

[[ 0.  1.  2.]
 [ 3.  4.  5.]
 [ 6.  7.  8.]]

当在函数中传递时,我希望它像这样:

[[ 0.  0.  0.]
 [ 0.  0.  0.]
 [ 0.  0.  8.]]

exeption:

当有许多相等的最大值时,我只需要其中一个,其余的就是零(顺序无关紧要) .

对于如何以优雅的方式制作这个更高效的方法我是多么无能为力,你会怎么做?

1 回答

  • 2

    为了提高效率,请使用 array-initializationargmax 获取最大索引(如果多于一个,则首先对其进行线性索引) -

    def app_flat(my_array):
        out = np.zeros_like(my_array)
        idx  = my_array.argmax()
        out.flat[idx] = my_array.flat[idx]
        return out
    

    我们也可以使用 ndarray.ravel() 代替 ndaarray.flat ,我认为性能数字可以比较 .

    对于这个sparsey输出,为了提高内存效率和性能,您可能需要使用 sparse 矩阵,尤其是对于大型数组 . 因此,对于稀疏矩阵输出,我们将有一个替代的,如此 -

    from scipy.sparse import coo_matrix
    
    def app_sparse(my_array):
        idx  = my_array.argmax()
        r,c = np.unravel_index(idx, my_array.shape)
        return coo_matrix(([my_array[r,c]],([r],[c])),shape=my_array.shape)
    

    样品运行 -

    In [336]: my_array
    Out[336]: 
    array([[0, 1, 2],
           [3, 4, 5],
           [8, 7, 8]])
    
    In [337]: app_flat(my_array)
    Out[337]: 
    array([[0, 0, 0],
           [0, 0, 0],
           [8, 0, 0]])
    
    In [338]: app_sparse(my_array)
    Out[338]: 
    <3x3 sparse matrix of type '<type 'numpy.int64'>'
        with 1 stored elements in COOrdinate format>
    
    In [339]: app_sparse(my_array).toarray() # just to confirm values
    Out[339]: 
    array([[0, 0, 0],
           [0, 0, 0],
           [8, 0, 0]])
    

    大阵列上的运行时测试 -

    In [340]: my_array =  np.random.randint(0,1000,(5000,5000))
    
    In [341]: %timeit app_flat(my_array)
    10 loops, best of 3: 34.9 ms per loop
    
    In [342]: %timeit app_sparse(my_array) # sparse matrix output
    100 loops, best of 3: 17.2 ms per loop
    

相关问题