【问题标题】:How to map a 2d array in numpy?如何在numpy中映射二维数组?
【发布时间】:2021-08-24 22:55:00
【问题描述】:

我想将图像的像素映射到 0 和 1。像素存储在一个 numpy 数组中,如下所示:

[[0, 255, 0, 255,...], [0, 255, 0, 255, 0, ...], ...]

我想将此数组映射到一个新数组,新数组的每个元素x 都是f(x),这里是f = lambda x: 1 if x > 127 else 0

我想知道如何在 numpy 中执行此操作,但没有找到可靠的答案。我也想知道什么时候数组的维数增加了,这个答案还能用吗?

【问题讨论】:

  • (arr > 127).astype(int)
  • 我只是不明白如何在多维数组中应用它
  • 这可能行得通,但其他功能呢?

标签: python numpy data-science


【解决方案1】:

np.where(myArray > 127, 1, 0)

至于在 numpy 数组中映射任意函数:有几种方法,但它们在性能和灵活性方面都有缺点。缓慢的 NumPy 方式是:

@np.vectorize # make f a ufunc
def f(x):
    if x > 127:
        return 1
    else:
        return 0

f(myArray)

现在,您可以使用 Numba 使其更快(甚至比 np.where 更快,因为它不会多次遍历数组的元素):

import numba as nb

@nb.vectorize # also makes f a ufunc but it compiles f
def f(x):
    if x > 127:
        return 1
    else:
        return 0

f(myArray)

但正如我在 cmets 中所说,Numba 版本在类型调度方面存在问题;当您对两个不同数值类型的数组进行数学运算时,这很容易成为一个问题。您还受限于 Numba 编译器可以使用的有限 Python;你的例子很简单,不需要任何编辑。

【讨论】:

  • 谢谢,它将帮助我解决当前的问题。但是其他功能呢?
  • 因此,在 NumPy 数组中“映射”或更准确地“广播”的函数称为 ufunc。您可以使用numpy.vectorize 在标量上从 Python 函数创建一个 ufunc,但速度很慢(NumPy 的 ufunc 很快,因为它的所有标量函数都在 C 中)。有一些库可用于制作快速 ufunc,但它要么变得非常不符合 Python,要么严重限制了 Python。我之前尝试过 Numba,但我发现 numba.vectorize 在调度到预期类型时存在问题,所以我最终只使用 Numba 编写简单的循环,这对于矢量化 NumPy 来说很棘手。
  • 如果我是正确的,vectorize 使标量函数成为一个 ufunc,它接受一个数组而不是单个项目。但我的问题是我不知道如何将其扩展到多维数组(例如简单形式的 2d)
  • 如果能举个例子就好了
  • 哦,一个 ufunc 需要一个任意维度(1d、2d、3d、n-d)的 NumPy 数组。
【解决方案2】:

朋友,你可以这样做:

def f(x):
  pass

uf = np.vectorize(f)
uf(numarray)

它将应用于所有元素。我也对二维数组进行了测试。

【讨论】:

    猜你喜欢
    • 2018-06-10
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多