在numpy

时间:2018-07-23 02:59:13

标签: python arrays numpy binary vectorization

我正在尝试将整数数组转换为python中的二进制表示形式。我知道原生python有一个名为bin的函数可以执行此操作。 Numpy也具有类似的功能:numpy.binary_repr

问题在于,这些方法都不是 vectorized 方法,因为它们一次只采用一个值。因此,为了让我转换整个输入数组,我必须使用一个for循环并多次调用这些函数,这不是很有效。

有没有没有for循环的转换方法?这些功能有矢量化形式吗?我已经尝试过numpy.apply_along_axis,但是没有运气。我也尝试过使用np.fromitermap,但这也是不可行的。

我知道类似的问题曾被问过几次(例如here),但给出的答案实际上都不是矢量化的。

将我指向任何方向将不胜感激!

谢谢=)

2 个答案:

答案 0 :(得分:0)

最简单的方法是将binary_reprvectorize一起使用,它将保留原始的数组形状,例如:

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)