如何在 numpy 中映射二维数组?

How to map a 2d array in numpy?

我想将图像的像素映射到 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 中执行此操作,但尚未找到可靠的答案。我也想知道当数组的维度增加时,答案是否仍然有效?

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)

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

朋友,你可以这样做:

def f(x):
  pass

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

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