我正在尝试将整数数组转换为python中的二进制表示形式。我知道原生python有一个名为bin
的函数可以执行此操作。 Numpy也具有类似的功能:numpy.binary_repr
。
问题在于,这些方法都不是 vectorized 方法,因为它们一次只采用一个值。因此,为了让我转换整个输入数组,我必须使用一个for循环并多次调用这些函数,这不是很有效。
有没有没有for循环的转换方法?这些功能有矢量化形式吗?我已经尝试过numpy.apply_along_axis
,但是没有运气。我也尝试过使用np.fromiter
和map
,但这也是不可行的。
我知道类似的问题曾被问过几次(例如here),但给出的答案实际上都不是矢量化的。
将我指向任何方向将不胜感激!
谢谢=)
答案 0 :(得分:0)
最简单的方法是将binary_repr
与vectorize
一起使用,它将保留原始的数组形状,例如:
binary_repr_v = np.vectorize(np.binary_repr)
x = np.arange(-9, 21).reshape(3, 2, 5)
print(x)
print()
print(binary_repr_v(x, 8))
输出:
[[[-9 -8 -7 -6 -5]
[-4 -3 -2 -1 0]]
[[ 1 2 3 4 5]
[ 6 7 8 9 10]]
[[11 12 13 14 15]
[16 17 18 19 20]]]
[[['11110111' '11111000' '11111001' '11111010' '11111011']
['11111100' '11111101' '11111110' '11111111' '00000000']]
[['00000001' '00000010' '00000011' '00000100' '00000101']
['00000110' '00000111' '00001000' '00001001' '00001010']]
[['00001011' '00001100' '00001101' '00001110' '00001111']
['00010000' '00010001' '00010010' '00010011' '00010100']]]
答案 1 :(得分:0)
我发现(到目前为止)最快的方法是使用 pd.Series.apply()
函数。
测试结果如下:
import pandas as pd
import numpy as np
x = np.random.randint(1,10000000,1000000)
# Fastest method
%timeit pd.Series(x).apply(bin)
# 135 ms ± 539 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# rafaelc's method
%timeit [np.binary_repr(z) for z in x]
# 725 ms ± 5.31 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# aparpara's method
binary_repr_v = np.vectorize(np.binary_repr)
%timeit binary_repr_v(x, 8)
# 7.46 s ± 24.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)