<p>解决此问题的一种方法是通过简单的切片调整<code>b</code>以匹配所需的输出,类似于<a href="https://stackoverflow.com/a/60778437/5218354">@GrzegorzSkibinski answer</a>中所建议的:</p>
<pre><code>import numpy as np
def gen_bits_by_val(values):
n = int(max(values)).bit_length()
return np.unpackbits(values, axis=1)[:, -n:].copy()
print(gen_bits_by_val(a))
# [[0 0]
# [0 1]
# [1 0]
# [1 1]]
</code></pre>
<hr/>
<p>或者,您可以创建一个查找表,类似于<a href="https://stackoverflow.com/a/60778700/5218354">@WarrenWeckesser answer</a>中所建议的,使用以下命令:</p>
<pre><code>import numpy as np
def gen_bits_by_num(n):
values = np.arange(2 ** n, dtype=np.uint8).reshape(-1, 1)
return np.unpackbits(values, axis=1)[:, -n:].copy()
bits2 = gen_bits_by_num(2)
print(bits2)
# [[0 0]
# [0 1]
# [1 0]
# [1 1]]
</code></pre>
<p>允许所有类型的用途,例如:</p>
<pre><code>bits4 = gen_bits_by_num(4)
print(bits4[[1, 3, 12]])
# [[0 0 0 1]
# [0 0 1 1]
# [1 1 0 0]]
</code></pre>
<hr/>
<h2>编辑</h2>
<p>考虑<a href="https://stackoverflow.com/a/60780628/5218354">@PaulPanzer answer</a>行:</p>
<pre><code>return np.unpackbits(values, axis=1)[:, -n:]
</code></pre>
<p>已替换为:</p>
<pre><code>return np.unpackbits(values, axis=1)[:, -n:].copy()
</code></pre>
<p>哪个内存效率更高</p>
<p>它本可以被以下内容取代:</p>
<pre><code>return np.unpackbits(values << (8 - n), axis=1, count=n)
</code></pre>
<p>具有类似的效果</p>