Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy如何将数组更改为除最大值以外的零值_Python_Arrays_Numpy - Fatal编程技术网

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

Python numpy如何将数组更改为除最大值以外的零值,python,arrays,numpy,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.]] 当传入函数时,我希望它如下所示: my_array = np.arange(9).reshape((3,3)) [

我想做一个函数,当输入一个数组时,它返回一个形状相同的数组,但是除了最大值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.]]
当传入函数时,我希望它如下所示:

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.]]
例外情况:

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


我真的不知道如何以一种更高效的优雅方式实现这一点,你会怎么做?

为了提高效率,请使用
数组初始化
argmax
获取最大索引(如果多个索引,则首先线性索引)-

我们也可以使用
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]])
只有几行:

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)

ravel
如果在平面视图中步幅不合适,则复制一个副本,因此
flat
在这里可能更好。