Со списками логическое индексирование работает нормально:
In [21]: A = [ 2, -3, 10, 0.2]
In [22]: sign_A = list(map(lambda u: (abs(u)==u), A))
In [23]: abs_A = [abs(e) for e in A]
In [24]: i=0; k=1
In [25]: abs_A[i]*(-1, 1)[sign_A[i]] + abs_A[k]**(-1, 1)[sign_A[k]]
Out[25]: 2.3333333333333335
Мы получаем предупреждение, если пытаемся индексировать с помощью булевого индекса:
In [26]: abs_A[i]*(-1, 1)[np.array(sign_A)[i]]
/usr/local/bin/ipython3:1: DeprecationWarning: In future, it will be an error for 'np.bool_' scalars to be interpreted as an index
#!/usr/bin/python3
Out[26]: 2
Мы можем обойти этосделав массив sign_A
целым числом справа от начала:
In [27]: abs_A[i]*(-1, 1)[np.array(sign_A,dtype=int)[i]]
Out[27]: 2
Если мы начнем с массива:
In [28]: B = np.array(A)
массив знаков - используя where
для непосредственного отображения на(-1,1) пробел
In [30]: sign_B = np.where(B>=0,1,-1)
In [31]: sign_B
Out[31]: array([ 1, -1, 1, 1])
массив abs:
In [32]: abs_B = np.abs(B)
воссозданный массив:
In [33]: abs_B*sign_B
Out[33]: array([ 2. , -3. , 10. , 0.2])