【问题标题】:numpy element transformation with lambda?使用 lambda 进行 numpy 元素转换?
【发布时间】:2015-03-12 16:44:32
【问题描述】:

在 3D numpy 数组中,我需要对每个元素进行如下变换:如果小于 0,则必须变为 0,如果大于 255,则必须变为 255,否则保持原样。

如何使用 numpy 实现这一目标?我正在考虑类似的事情

img.transform_each(transform_func)

在哪里

def transform_func(x):
    if x<0:
        return 0;
    # etc

有没有像transform_each 这样的构建功能? 我不会手动进行 for-for-for 循环。

【问题讨论】:

    标签: python arrays numpy vectorization


    【解决方案1】:

    您可以使用clip 将数组的值保持在特定范围内。例如:

    >>> a = np.array([-1, 23, 312, 47, -5])
    >>> a.clip(0, 255)
    array([  0,  23, 255,  47,   0])
    

    返回一个包含值的相同形状的新数组 - 如果要使更改永久化,则需要将 a 重新分配给这个新数组,或者使用 out 参数执行操作地点:

    np.clip(a, 0, 255, out=a)
    

    为更复杂的操作开辟道路的另一种方法是布尔索引。

    例如,将数组a中小于0的元素设置为0

    a[a < 0] = 0
    

    或者将2的所有值乘以7,可以这样写:

    a[a == 2] *= 7
    

    【讨论】:

    • 这样更好!将在 7 分钟内接受。但是,如果转换更复杂怎么办?我相信消息来源会告诉我,但如果您已经知道,请也分享此信息。
    • 很高兴这是您正在寻找的东西!如果这就是您的意思,它会返回一个相同维度的数组 - 如果 a 是 3D,那么裁剪后的数组也是如此。
    • 其实没有,我要问的是,如果我不需要剪辑,而是一些自定义转换,比如“如果元素为 5,则将其替换为 2,否则乘以 4”?
    • 啊 - 不,clip 不能这样做,它只是将值限制在特定范围内。您最好使用布尔索引进行您描述的转换。
    • @IlyaSmagin:我已经编辑了我的答案,包括对布尔索引及其应用方式的简要说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多