如何改进以下代码?
1 )-> 传递长度为 2**n
2 )-> 对于数组的每个索引获取二进制表示
3 )-> 反转二进制表示并将其用作相应值的新整数索引
示例:
[56,209,81,42]
[00,01,10,11](索引的二进制表示)
-> 反转:[00,10,01,11]
-> 变为:[56,81,209,42]
代码:
def order_in_reversed_bits(data: np.ndarray) -> np.ndarray:
tobinary = lambda t: np.binary_repr(t, width=len(np.binary_repr(data.shape[0]-1)))[::-1]
func = np.vectorize(tobinary)
a = func(np.arange(0,data.shape[0]))
t = np.zeros(data.shape,dtype='float64')
for i,k in enumerate(a):
t[int(k,2)] = data[i]
return t
Numpy 或 Python 的哪个内置功能比较方便?
最佳答案
例如,您可以将 sorted
与自定义键一起使用(感谢 @hpaulj 使用 bin()
改进了键功能):
lst = [56,209,81,42]
def order_in_reversed_bits_python(lst):
return [v for _, v in sorted(enumerate(lst), key=lambda k: bin(k[0])[:1:-1])]
print(order_in_reversed_bits_python(lst))
打印:
[56, 81, 209, 42]
<小时/>
时间安排:
import timeit
from random import randint
def order_in_reversed_bits_python(lst):
return [v for _, v in sorted(enumerate(lst), key=lambda k: bin(k[0])[:1:-1])]
def order_in_reversed_bits(data):
tobinary = lambda t: np.binary_repr(t, width=len(np.binary_repr(data.shape[0]-1)))[::-1]
func = np.vectorize(tobinary)
a = func(np.arange(0,data.shape[0]))
t = np.zeros(data.shape,dtype='float64')
for i,k in enumerate(a):
t[int(k,2)] = data[i]
return t
# create some large array:
lst = np.array([randint(1, 100) for _ in range(2**16)])
t1 = timeit.timeit(lambda: order_in_reversed_bits_python(lst), number=1)
t2 = timeit.timeit(lambda: order_in_reversed_bits(lst), number=1)
print(t1)
print(t2)
打印:
0.05821935099811526
0.22723246600071434
改进了约 3.9 倍
关于python - 如何使用反向二进制表示重新索引 numpy 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59996458/