我有一个像这样的布尔numpy数组,
>>> np_arr
array([[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 1, 0, 0],
[1, 1, 1, 1, 0, 1, 0, 0],
[1, 1, 1, 1, 0, 1, 0, 0]])
和另一个像这样的一维数组,
>>> another_arr
array([128, 64, 32, 16, 8, 4, 2, 1])
我想以某种方式做一些和或添加来获取只存在1的值,
>>> np_arr
array([[128,64,32,8, 0, 0, 2, 1],
[128,64,32,8, 0, 0, 2, 1],
....................
[128,64,32,8, 0,4, 0, 0],
.....................)
然后我可以将它们相加以找到2D数组中每个1D数组的二进制值。 或者是获得十进制值numpy数组的一些简单方法吗?
答案 0 :(得分:4)
这是一种方式。它起作用是因为numpy
隐式广播。
import numpy as np
mask = np.array([[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 1, 0, 0],
[1, 1, 1, 1, 0, 1, 0, 0],
[1, 1, 1, 1, 0, 1, 0, 0]])
arr = np.array([128, 64, 32, 16, 8, 4, 2, 1])
arr2 = arr * mask
# array([[128, 64, 32, 16, 0, 0, 2, 1],
# [128, 64, 32, 16, 0, 0, 2, 1],
# [128, 64, 32, 16, 0, 0, 2, 1],
# [128, 64, 32, 16, 0, 0, 2, 1],
# [128, 64, 32, 16, 0, 0, 2, 1],
# [128, 64, 32, 16, 0, 4, 0, 0],
# [128, 64, 32, 16, 0, 4, 0, 0],
# [128, 64, 32, 16, 0, 4, 0, 0]])
答案 1 :(得分:4)
您需要的可能是:
import numpy as np
ar = np.array([[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 1, 0, 0],
[1, 1, 1, 1, 0, 1, 0, 0],
[1, 1, 1, 1, 0, 1, 0, 0]])
np.packbits(ar, axis=-1)
结果:
array([[243],
[243],
[243],
[243],
[243],
[244],
[244],
[244]], dtype=uint8)
答案 2 :(得分:0)
import numpy as np
ar = np.array([[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1],
[1, 1, 1, 1, 0, 1, 0, 0],
[1, 1, 1, 1, 0, 1, 0, 0],
[1, 1, 1, 1, 0, 1, 0, 0]])
a = np.array([17, 16, 12, 41, 0, 0, 5, 12])
for _ in ar:
m = np.multiply(_, a)
print(m)
这里我打印了这些值,但您可以将它们附加到数组中或按照您的喜好使用。