我正在使用一个(numpy)整数数组来记录数据数组的潜在问题。概念是每种错误类型都有其自己的整数值,并且将其设置为
Process.Start("sample.dot")
我认为,通过这种方式,我可以将这些错误类型添加到整数日志记录数组中,并且仍然知道由错误组成的值是什么?因此,如果结束数组的值为7,我知道它必须由1 + 2 + 4组成-即err1,err2和err3。
在当时,这一切看起来都很聪明,但是我现在需要生成一个布尔数组,告诉我哪些单元记录了给定的错误。因此,例如,如果我的错误数组为
err1 = 1
err2 = 2 ** 1
err3 = 2 ** 2
...
errx = 2 ** x
我想得到结果
test_arr = np.array(
[[1, 5, 19],
[3, 4, 12]]
)
因为值4组成了值5和4,但没有其他值。我已经为单个值开发了一种迭代解决方案,但是那样对矢量化计算效果不佳(实际数组很大)。有人可以提出建议吗?我觉得这里没有更简单的东西。
谢谢!
答案 0 :(得分:2)
您应该研究按位运算。 这样一来,您就可以在一个连接值中编码多个不同的数字,例如以下代码段的输出
a = (3 << 24) + (8 << 16) + 5
print (a)
print(a>>24 & 0xf)
print(a>>16 & 0xf)
print(a & 0xf)
看起来像这样:
50855941
3
8
5
现在,如果您尝试使用它,则可以对任意数量的变量进行编码,只要确保为每个变量提供足够的位以覆盖该变量的最大可能值-单个变量的溢出会损坏您的数据。
现在,当您需要比较触发了哪些错误时,必须对特定错误的位掩码(位置)进行检查,您将很容易知道该特定错误是否已注册。
在我看来,对于您的问题,您只需要知道发生了哪些错误,而无需保存错误代码。
然后,您可以采用一种简化的方案,其中每个错误保留1位,并在代码中保留bit->error
映射。
最后,当您要显示触发了哪些错误时,只需要获取编码数字的二进制值,然后将1转换为True,将0转换为False。
答案 1 :(得分:1)
我可能有解决方案,请检查是否适合您
>>> func = lambda x,y: bin(y)[-x] == u'1' if y >= 2**(x-1) else False
>>> func_vec = np.vectorize(func)
>>> check_for_error = 3 # to check err3 = 2**2 = 4
>>> func_vec(check_for_error, test_arr)
array([[False, True, False],
[False, True, True]])
>>> check_for_error = 4 # to check err4 = 2**3 = 8
>>> func_vec(check_for_error, test_arr)
array([[False, False, False],
[False, False, True]]) # only true for 12 (= 8 + 4)
逻辑是,当一个数字是二元数时,如果以二进制形式检查1
s的索引,则可以发现使用二的幂来构造数字。
如果要在将错误加到电源后检查错误,例如,如果要检查8,即2 ** 3,则可以使用以下功能:
import numpy as np
import math
test_arr = np.array(
[[1, 5, 19],
[3, 4, 12]]
)
func = lambda x,y: bin(y)[-int(math.log(x,2))] == u'1' if y >= x else False
func_vec = np.vectorize(func)
check_for_error = 8
print(func_vec(check_for_error, test_arr))
输出:
[[False False False]
[False False True]] # checking for 8. 8 found in 12 (= 8 + 4)
编辑: 一种找出构成数字的所有错误的方法:
>>> test_arr =
np.array([[ 1, 5, 19],
[ 3, 4, 12],
[ 7, 27, 59]])
>>> func = lambda x: ','.join([str(2**i) for i,j in enumerate(reversed(bin(x))) if j==u'1'])
>>> func_vec = np.vectorize(func)
>>> func_vec(test_arr)
array([['1', '1,4', '1,2,16'],
['1,2', '4', '4,8'],
['1,2,4', '1,2,8,16', '1,2,8,16,32']], dtype='<U11')