Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据lambda函数将NumPy整数列表值映射到列表_Python_Arrays_Numpy - Fatal编程技术网

Python 根据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

如何根据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: 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。很高兴这有帮助。看看