我已經創建了一個小函數,它作爲輸入的整數,length
,並返回所有2**length
整數的二進制表示的範圍內[0:2**length-1]
一個numpy
array
。轉換十進制範圍numpy的陣列,每個比特爲一個數組元素
import numpy as np
def get_bitstrings(length):
# We need to binary-fy 2^length numbers.
iterations = 2**length
# Pre-allocate memory.
the_array = np.zeros((iterations, length))
# Go through all decimals in the range [0:iterations-1]
for num in range(iterations):
# Get binary representation in string format with 'length' zeroes padded
t_string = '{f_num:0{f_width}b}'.format(f_num=num, f_width=length)
# Convert to a Python list
t_list = list(t_string)
# Convert to Numpy array and store.
the_array[num,:] = np.array(t_list)
return the_array
if __name__ == '__main__':
var1 = get_bitstrings(2)
var2 = get_bitstrings(3)
print('var1:\n{}\n'.format(var1))
print('var2:\n{}\n'.format(var2))
其產生:
var1:
[[ 0. 0.]
[ 0. 1.]
[ 1. 0.]
[ 1. 1.]]
var2:
[[ 0. 0. 0.]
[ 0. 0. 1.]
[ 0. 1. 0.]
[ 0. 1. 1.]
[ 1. 0. 0.]
[ 1. 0. 1.]
[ 1. 1. 0.]
[ 1. 1. 1.]]
該方法包括獲取每個整數的二進制表示爲一個字符串(以0之前填充它,使得長度是恆定在length
),將所述字符串到Python列表中,然後將列表轉換爲numpy
array
。
我發現這是爲了滿足每個比特是在陣列中的條目的需求的唯一方式 - 即,位串1010
是1x4
numpy
array
,而不是簡單的在1x1
陣列整數。但我相信有更好的選擇,因此這個問題。
可以想象,這個問題是效率低下的。我想知道是否可以通過使用Python/Numpy技巧來改善這一點。
編輯: 我用這個片段執行此操作在MATLAB:
t_length = 5; dc = [0:2^t_length-1]'; bc = rem(floor(dc * pow2( - (t_length-1):0)),2);
但是當談到Python/Numpy時,我是一個完整的noob!也許它會激勵某人。 :-)
也許你可以再商量與進步,但我認爲,即使布爾變量中表示爲numpy的8位...... – deinonychusaur
'np.arange(2 ** k)'會給出一個實際的「bitstring」(即'np.int')和所需的二進制值。你需要做什麼? –
@deinonychusaur我需要的元素是整數或floatz,而不是布爾值。 – sudosensei