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

时间:2017-11-14 21:27:55

标签: python arrays numpy

我想创建一个函数,当它提供一个数组时,它返回一个相同形状的数组,但是所有零都期望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:

当有许多相等的最大值时,我只需要其中一个,其余的就是零(订单并不重要)。

对于如何以优雅的方式做到这一点更加高效,我是多么无能为力,你会怎么做?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

几行:

my_array = np.arange(9).reshape((3,3))
my_array2 = np.zeros(len(my_array.ravel()))
my_array2[np.argmax(my_array)] = np.max(my_array)
my_array2 = my_array2.reshape(my_array.shape)