Python 根据lambda函数将NumPy整数列表值映射到列表
如何根据lambda函数将整数NumPy数组的每个值映射到列表 我有以下代码:Python 根据lambda函数将NumPy整数列表值映射到列表,python,arrays,numpy,Python,Arrays,Numpy,如何根据lambda函数将整数NumPy数组的每个值映射到列表 我有以下代码: x = [0, 1, 2, 0, 0, 2, 1, 1] colours = [[0, 0, 0], [255, 0, 0], [0, 255, 0], [0, 0, 255]] coloured = lambda v: colours[int(v)] vcoloured = np.vectorize(coloured) x_color = vcoloured(x) # throws ValueError: se
x = [0, 1, 2, 0, 0, 2, 1, 1]
colours = [[0, 0, 0], [255, 0, 0], [0, 255, 0], [0, 0, 255]]
coloured = lambda v: colours[int(v)]
vcoloured = np.vectorize(coloured)
x_color = vcoloured(x) # throws ValueError: setting an array element with a sequence.
# would like to get x_color = [[0, 0, 0], [255, 0, 0], [0, 255, 0], [0, 0, 0], [0, 0, 0], [0, 255, 0], [255, 0, 0], [255, 0, 0]]
一点也不必理会清单。如果您有numpy阵列,那么使用numpy的功能会更快:
>>> x = np.array([0, 1, 2, 0, 0, 2, 1, 1])
>>> colors = np.array([[0, 0, 0], [255, 0, 0], [0, 255, 0], [0, 0, 255]])
>>> x_color = colors[x]
>>> x_color
array([[ 0, 0, 0],
[255, 0, 0],
[ 0, 255, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 255, 0],
[255, 0, 0],
[255, 0, 0]])
是的,我继续并美国化了你的拼写,但是从功能上来说,数组x_colored
的行为就像一个列表,用于所有实际用途。如果您确实需要列表,只需调用tolist
查看结果:
x_color = colors[x].tolist()
使用向量化的
有问题,因为它必须猜测返回的数组dtype
。函数返回的是列表,而不是数字。因此,我们需要指定返回的dtype-as对象:
In [25]: x = [0, 1, 2, 0, 0, 2, 1, 1]
...: colours = [[0, 0, 0], [255, 0, 0], [0, 255, 0], [0, 0, 255]]
...:
...: coloured = lambda v: colours[int(v)]
...: vcoloured = np.vectorize(coloured, otypes=[object])
In [26]: vcoloured(x)
Out[26]:
array([list([0, 0, 0]), list([255, 0, 0]), list([0, 255, 0]),
list([0, 0, 0]), list([0, 0, 0]), list([0, 255, 0]),
list([255, 0, 0]), list([255, 0, 0])], dtype=object)
可以转换为二维阵列,具有:
In [27]: np.stack(_)
Out[27]:
array([[ 0, 0, 0],
[255, 0, 0],
[ 0, 255, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 255, 0],
[255, 0, 0],
[255, 0, 0]])
但是vectorize
不是一个性能工具(阅读其文档)。使用列表理解更快:
In [28]: np.array([colours[v] for v in x])
Out[28]:
array([[ 0, 0, 0],
[255, 0, 0],
[ 0, 255, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 255, 0],
[255, 0, 0],
[255, 0, 0]])
@Mad答案的直接数组索引更好。@AfonsoSalgadoSousa。很高兴这有帮助。看看