使用ufunc映射numpy数组

时间:2012-08-31 01:08:31

标签: python numpy

我正在尝试使用ufunc有效地将N * 1 numpy数组的int映射到N * 3 numpy浮点数组。

到目前为止我所拥有的:

map = {1: (0, 0, 0), 2: (0.5, 0.5, 0.5), 3: (1, 1, 1)}
ufunc = numpy.frompyfunc(lambda x: numpy.array(map[x], numpy.float32), 1, 1)

input = numpy.array([1, 2, 3], numpy.int32)

ufunc(input)给出一个带有dtype对象的3 * 3数组。我想要这个数组但是使用dtype float32。

4 个答案:

答案 0 :(得分:1)

您可以使用np.hstack

import numpy as np
mapping = {1: (0, 0, 0), 2: (0.5, 0.5, 0.5), 3: (1, 1, 1)}
ufunc = np.frompyfunc(lambda x: np.array(mapping[x], np.float32), 1, 1, dtype = np.float32)

data = np.array([1, 2, 3], np.int32)
result = np.hstack(ufunc(data))
print(result)
# [ 0.   0.   0.   0.5  0.5  0.5  1.   1.   1. ]
print(result.dtype)
# float32
print(result.shape)
# (9,)

答案 1 :(得分:1)

你可以使用ndarray花式索引来获得相同的结果,我认为它应该比frompyfunc更快:

map_array = np.array([[0,0,0],[0,0,0],[0.5,0.5,0.5],[1,1,1]], dtype=np.float32)
index = np.array([1,2,3,1])
map_array[index]

或者你可以使用列表理解:

map = {1: (0, 0, 0), 2: (0.5, 0.5, 0.5), 3: (1, 1, 1)}
np.array([map[i] for i in [1,2,3,1]], dtype=np.float32)    

答案 2 :(得分:1)

如果你的映射是一个numpy数组,你可以使用花式索引:

>>> valmap = numpy.array([(0, 0, 0), (0.5, 0.5, 0.5), (1, 1, 1)])
>>> input = numpy.array([1, 2, 3], numpy.int32)
>>> valmap[input-1]
array([[ 0. ,  0. ,  0. ],
       [ 0.5,  0.5,  0.5],
       [ 1. ,  1. ,  1. ]])

答案 3 :(得分:1)

除非我误读文档,np.frompyfunc的输出确实在标量对象上:当使用ndarray作为输入时,您将获得ndarray dtype=obj }。

解决方法是使用np.vectorize函数:

F = np.vectorize(lambda x: mapper.get(x), 'fff')

在这里,我们强制dtype的{​​{1}}输出为3个浮点数(因此为F)。

'fff'

好吧,不是我们想要的:它是三个浮点数组的元组(因为我们给'fff'),第一个数组相当于>>> mapper = {1: (0, 0, 0), 2: (0.5, 1.0, 0.5), 3: (1, 2, 1)} >>> inp = [1, 2, 3] >>> F(inp) (array([ 0. , 0.5, 1. ], dtype=float32), array([ 0., 0.5, 1.], dtype=float32), array([ 0. , 0.5, 1. ], dtype=float32)) 。所以,稍加操纵:

[mapper[i][0] for i in inp]