python - 如何使用反向二进制表示重新索引 numpy 数组?

标签 python pandas numpy

如何改进以下代码?

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/

相关文章:

python - 类型对象 'User' 没有属性 'objects' (AbstractUser) python

python - 使用 SqlAlchemy 在无限循环中获取新结果

python - 从pandas.dataframe中提取特定的列

python - 对从 np.where 获得的索引应用偏移量

python - Numpy 数组排除一些元素

python - 自定义渲染器破坏站点

python - 设置高级 Python 日志记录

python - 子集 df 以针对时间戳进行调整

python - 使用 pandas.read_csv 的 na_values 正则表达式

python - 如何使用 OpenCV 在 Python 中查找图像的平均颜色?