在 numpy 数组中映射值
Mapping values in a numpy array
如何从只有三个不同值的 2D numpy 数组:-1、0 和 1 并将它们映射到颜色 red
(255,0,0),green
(0,255,0) 和 blue
(255,0,0)?该数组非常大,但为了让您了解我在寻找什么,假设我有输入
array([[ 1, 0, -1],
[-1, 1, 1],
[ 0, 0, 1]])
我想要输出:
array([[(0, 0, 255), (0, 255, 0), (255, 0, 0)],
[(255, 0, 0), (0, 0, 255), (0, 0, 255)],
[(0, 255, 0), (0, 255, 0), (0, 0, 255)]])
我可以 for-loop 并有条件,但我想知道是否有一个或两个使用 lambda 函数的衬里可以完成这个?谢谢!
您可能需要考虑结构化数组,因为它允许数据类型不为 object
.
的元组
import numpy as np
replacements = {-1: (255, 0, 0), 0: (0, 255, 0), 1: (0, 0, 255)}
arr = np.array([[ 1, 0, -1],
[-1, 1, 1],
[ 0, 0, 1]])
new = np.zeros(arr.shape, dtype=np.dtype([('r', np.int32), ('g', np.int32), ('b', np.int32)]))
for n, tup in replacements.items():
new[arr == n] = tup
print(new)
输出:
[[( 0, 0, 255) ( 0, 255, 0) (255, 0, 0)]
[(255, 0, 0) ( 0, 0, 255) ( 0, 0, 255)]
[( 0, 255, 0) ( 0, 255, 0) ( 0, 0, 255)]]
另一种选择是使用 3D 数组,其中最后一个维度是 3
。第一个 "layer" 是红色,第二个 "layer" 是绿色,第三个 "layer" 是蓝色。此选项与 plt.imshow()
.
兼容
import numpy as np
arr = np.array([[ 1, 0, -1],
[-1, 1, 1],
[ 0, 0, 1]])
new = np.zeros((*arr.shape, 3))
for i in range(-1, 2):
new[i + 1, arr == i] = 255
输出:
array([[[ 0., 0., 255.],
[255., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 255., 0.],
[ 0., 0., 0.],
[255., 255., 0.]],
[[255., 0., 0.],
[ 0., 255., 255.],
[ 0., 0., 255.]]])
如何从只有三个不同值的 2D numpy 数组:-1、0 和 1 并将它们映射到颜色 red
(255,0,0),green
(0,255,0) 和 blue
(255,0,0)?该数组非常大,但为了让您了解我在寻找什么,假设我有输入
array([[ 1, 0, -1],
[-1, 1, 1],
[ 0, 0, 1]])
我想要输出:
array([[(0, 0, 255), (0, 255, 0), (255, 0, 0)],
[(255, 0, 0), (0, 0, 255), (0, 0, 255)],
[(0, 255, 0), (0, 255, 0), (0, 0, 255)]])
我可以 for-loop 并有条件,但我想知道是否有一个或两个使用 lambda 函数的衬里可以完成这个?谢谢!
您可能需要考虑结构化数组,因为它允许数据类型不为 object
.
import numpy as np
replacements = {-1: (255, 0, 0), 0: (0, 255, 0), 1: (0, 0, 255)}
arr = np.array([[ 1, 0, -1],
[-1, 1, 1],
[ 0, 0, 1]])
new = np.zeros(arr.shape, dtype=np.dtype([('r', np.int32), ('g', np.int32), ('b', np.int32)]))
for n, tup in replacements.items():
new[arr == n] = tup
print(new)
输出:
[[( 0, 0, 255) ( 0, 255, 0) (255, 0, 0)]
[(255, 0, 0) ( 0, 0, 255) ( 0, 0, 255)]
[( 0, 255, 0) ( 0, 255, 0) ( 0, 0, 255)]]
另一种选择是使用 3D 数组,其中最后一个维度是 3
。第一个 "layer" 是红色,第二个 "layer" 是绿色,第三个 "layer" 是蓝色。此选项与 plt.imshow()
.
import numpy as np
arr = np.array([[ 1, 0, -1],
[-1, 1, 1],
[ 0, 0, 1]])
new = np.zeros((*arr.shape, 3))
for i in range(-1, 2):
new[i + 1, arr == i] = 255
输出:
array([[[ 0., 0., 255.],
[255., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 255., 0.],
[ 0., 0., 0.],
[255., 255., 0.]],
[[255., 0., 0.],
[ 0., 255., 255.],
[ 0., 0., 255.]]])