根据其值将int数组更改为字符串数组

时间:2017-04-11 18:50:21

标签: python-3.x numpy

我有一个包含0和1值的nparray

k = np.array([0, 1, 1, 0 ,1])

我希望将数组转换为包含'blue'的数组(如果值为0)和'red'(如果值为1)我希望知道最快的方式

1 个答案:

答案 0 :(得分:3)

您可以使用np.take索引2元素的数组/列表,其中k个值为索引,如此 -

np.take(['blue','red'],k)

示例运行 -

In [19]: k = np.array([0, 1, 1, 0 ,1])

In [20]: np.take(['blue','red'],k)
Out[20]: 
array(['blue', 'red', 'red', 'blue', 'red'], 
      dtype='|S4')

使用显式索引方法 -

In [23]: arr = np.array(['blue','red'])

In [24]: arr[k]
Out[24]: 
array(['blue', 'red', 'red', 'blue', 'red'], 
      dtype='|S4')

或者使用一个字符串初始化然后分配另一个字符串 -

In [41]: out = np.full(k.size, 'blue')

In [42]: out[k==1] = 'red'

In [43]: out
Out[43]: 
array(['blue', 'red', 'red', 'blue', 'red'], 
      dtype='|S4')

运行时测试

方法 -

def app1(k):
    return np.take(['blue','red'],k)

def app2(k):
    arr = np.array(['blue','red'])
    return arr[k]

def app3(k):
    out = np.full(k.size, 'blue')
    out[k==1] = 'red'
    return out

计时 -

In [46]: k = np.random.randint(0,2,(100000))

In [47]: %timeit app1(k)
    ...: %timeit app2(k)
    ...: %timeit app3(k)
    ...: 
1000 loops, best of 3: 413 µs per loop
10000 loops, best of 3: 103 µs per loop
1000 loops, best of 3: 908 µs per loop