如何在 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)
它将应用于所有元素。我也对二维数组进行了测试。
我想将图像的像素映射到 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)
它将应用于所有元素。我也对二维数组进行了测试。