我有一個代表位陣列的 numpy 陣列(dtype bool)。例如,陣列np.array([True, False, False], dtype=bool)表示數字 4(實際上是bin(4) == 0b100)。
我想將 numpy 陣列轉換為整數(4在前面的示例中)。
到目前為止,我已經嘗試過一種迭代方法:
bits = np.array([True, False, False], dtype=bool)
n = 0
for bit in bits:
n = (n << 1) | bit
這種方法確實有效,但我更喜歡不會遍歷陣列的每個元素的東西,可能是一個 numpy 內置方法。
我還嘗試使用numpy.packbits(與 一起numpy.pad,因為packbits總是自動填充到右側,而不是左側):
bits = np.array([True, False, False], dtype=bool)
n = np.packbits(np.pad(bits, ((8 - len(bits) % 8) % 8, 0))).item()
此方法僅適用于具有 8 個或更少元素的陣列。實際上,如果您嘗試使用更長的陣列,您最終會得到多個結果(因為顯然packbits不僅會向右填充,而且還會將每個位元組轉換為數字):
bits = np.array(
[True, False, False, False, False, False, False, False, False],
dtype=bool,
)
n = np.packbits(np.pad(bits, ((8 - len(bits) % 8) % 8, 0)))
print(n) # this prints [1 0], but I need it to return 256
預期行為:
np.array([True, True], dtype=bool) --> 3
np.array([True, True, False], dtype=bool) --> 6
np.array([True, False, False, True, True], dtype=bool) --> 19
np.array([True, False, False, False, False,
False, False, True, False, False], dtype=bool) --> 516
uj5u.com熱心網友回復:
您可以通過從最大的一個(例如 )開始生成兩個的冪來解決此問題,然后在進行最終總和之前[16, 8, 4, 2, 1]將其乘以:bits
powers = 1 << np.arange(bits.size, dtype=np.uint64)[::-1]
result = np.sum(powers * bits)
這相當于做:2**n * bits[0] 2**(n-1) * bits[1] ... 2**0 * bits[n]. 請注意,最終值需要適合 64 位。
uj5u.com熱心網友回復:
嘗試使用numpy.logspace:
import numpy as np
bits = np.array([True, False, False, False, False, False, False, False, False],dtype=bool,)
bits=bits[::-1]
result = np.sum(np.logspace(0, bits.size-1, num=bits.size, base=2) * bits, dtype=np.int)
這輸出:
print(result)
256
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/454366.html
