Python numpy如何将数组更改为除最大值以外的零值
我想做一个函数,当输入一个数组时,它返回一个形状相同的数组,但是除了最大值1之外,所有的零都是零。使用这样的数组: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)) [
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
在这里可能更好。