我想创建一个函数,当它提供一个数组时,它返回一个相同形状的数组,但是所有零都期望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:
当有许多相等的最大值时,我只需要其中一个,其余的就是零(订单并不重要)。
对于如何以优雅的方式做到这一点更加高效,我是多么无能为力,你会怎么做?
答案 0 :(得分:2)
为提高效率,请使用array-initialization
和argmax
获取最大索引(如果多于一个,则首先对其进行线性索引) -
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)