将'+'/'-'字符数组转换为+/-1 int值数组的numpy函数

numpy function which converts an array of '+'/'-' chars to an array of +/-1 int values

我有一个这样的数组:

sign_char_array = np.array(['+', '-', '+', '+'])
# dtype='<U1'

我想将其转换为 +1 和 -1 值的数组(以便轻松地将此符号数组与相应的整数或浮点值数组相乘)。我希望最终输出为:

converted_sign_array = np.array([1, -1, 1, 1])

我知道我可以编写以下代码行来手动执行此操作:

2 * (sign_char_array == '+').astype('int') - 1
# array([ 1, -1,  1,  1])

但是,我很好奇:是否有内置的 numpyastropy 函数可以进行这种转换?

对于上下文:我是一名天文学家,我经常使用已发表的科学表格,这些表格提供 sexagesimal coordinates. Sometimes the sign of the latitude/declination 坐标作为其自己的字符串数据列提供,而不是作为符号包含在下一栏。

np.where 是第一个想到的,尽管我确信有很多方法可以完成同样的事情。

converted_sign_array = np.where(sign_char_array == '+', 1, -1)

您有多种选择:

  • 最好的可能是 np.where, covered in the

  • 对于两个选项,可以使用直接索引:

     np.array([+1, -1])[(sign_char_array == '+').view(np.int8)]
    
  • np.select 是一种概括,允许您向输入添加更多选项:

     result = np.select([sign_char_array == '+',  sign_char_array == '-'], [1, -1])
    

    您可以使用广播简化第一个参数的计算。这也允许您扩展选项:

     result = np.select(sign_char_array == [['+'],  ['-'], ['t']], [1, -1, 2])
    
  • np.choose 是一个基于索引的函数,类似于 np.select:

     _, i = np.unique(sign_char_array, return_inverse=True)
     result = np.choose(i, [1, -1])
    

    您可以使用映射将此概括为许多选项,并且 np.unique 的输出已排序:

     map_in = np.array(['+', '-', 't'])
     map_out = np.array([1, -1, 2])
    
     _, i = np.unique(sign_char_array, return_inverse=True)
     result = np.choose(i, map_out[map_in.argsort()])
    

    您可以将 i 替换为 np.unique(sign_char_array, return_inverse=True)[1],从而将其变成单行代码。这种方法看起来比使用np.select更复杂,但实际上效率更高。