繁体   English   中英

替换numpy数组中大于限制的值

[英]Replacing values greater than a limit in a numpy array

我有一个数组nxm,每列的最大值。 除了检查每个元素之外,更换大于最大值的值的最佳方法是什么?

例如:

def check_limits(bad_array, maxs):
    good_array = np.copy(bad_array)
    for i_line in xrange(bad_array.shape[0]):
        for i_column in xrange(bad_array.shape[1]):
            if good_array[i_line][i_column] >= maxs[i_column]:
                good_array[i_line][i_column] = maxs[i_column] - 1
    return good_array

无论如何要以更简洁的方式更快地完成这项工作?

使用putmask

import numpy as np

a = np.array([[ 0,  1,  2,  3],
              [ 4,  5,  6,  7],
              [ 8,  9, 10, 11]])
m = np.array([7,6,5,4])

# This is what you need:

np.putmask(a, a >= m, m - 1)

# a is now:

np.array([[0, 1, 2, 3],
          [4, 5, 4, 3],
          [6, 5, 4, 3]])

另一种方法是使用剪辑功能:

使用eumiro的例子:

bad_array = np.array([[ 0,  1,  2,  3],
                      [ 4,  5,  6,  7],
                      [ 8,  9, 10, 11]])
maxs = np.array([7,6,5,4])

good_array = bad_array.clip(max=maxs-1)

要么

bad_array.clip(max=maxs-1, out=good_array)

您还可以通过添加参数min =来指定下限

如果我们没有对bad_array的结构做任何假设,那么你的代码就是对手参数的最佳选择。 如果我们知道每列按升序排序,那么一旦我们达到高于最大值的值,那么我们就知道该列中的每个后续元素也高于限制,但如果我们没有这样的假设,我们只需要检查每一个。

如果您决定首先对每列进行排序,则需要(n列* nlogn)时间,该时间已经大于检查每个元素所需的n * n时间。

您还可以通过一次检查和复制一个元素来创建good_array ,而不是复制bad_array所有元素并在以后检查它们。 这应该大致减少0.5倍的时间

如果列数不大,则一个优化是:

def check_limits(bad_array, maxs):
    good_array = np.copy(bad_array)
    for i_column in xrange(bad_array.shape[1]):
        to_replace = (good_array[:,i_column] >= maxs[i_column])
        good_array[to_replace, i_column] = maxs[i_column] - 1
    return good_array

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM