鉴于MATLAB uint32被解释为一个位串,什么是一种有效和简洁的方法来计算字符串中有多少非零位?
我有一个工作,天真的方法循环比特,但这对我的需求来说太慢了.(使用std :: bitset count()的C++实现几乎立即运行).
我找到了一个非常好的页面列出了各种位计数技术,但我希望有一种简单的MATLAB方式.
http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive
更新#1
刚刚实现了Brian Kernighan算法,如下所示:
w = 0;
while ( bits > 0 )
bits = bitand( bits, bits-1 );
w = w + 1;
end
Run Code Online (Sandbox Code Playgroud)
性能仍然很糟糕,超过10秒钟只计算4096 ^ 2重量计算.使用std :: bitset中的count()的我的C++代码在亚秒时间内执行此操作.
更新#2
这是我迄今为止尝试过的技术的运行时间表.我会在获得更多想法/建议时更新它.
矢量化Scheiner算法=> 2.243511秒 矢量化朴素bitget loop => 7.553345秒 Kernighan算法=> 17.154692秒 length(find(bitget(val,1:32)))=> 67.368278秒 nnz(bitget(val,1:32))=> 349.620259秒 Justin Scheiner的算法,展开循环=> 370.846031秒 Justin Scheiner的算法=> 398.786320秒 天真的比特环= = 456.016731秒 sum(dec2bin(val)=='1')=> 1069.851993秒
注释:MATLAB中的dec2bin()函数似乎执行得很差.它运行得非常慢.
注释:"Naive bitget loop"算法实现如下:
w=0;
for i=1:32
if bitget( val, i ) == 1
w = …Run Code Online (Sandbox Code Playgroud) 有没有办法在换行符上拆分从文件加载的位串?我有这样的事情:
A line of text
Additional line of text
And another line
Run Code Online (Sandbox Code Playgroud)
我想要一个像这样的数组:
["A line of text",
"Additional line of text",
"And another line"]
Run Code Online (Sandbox Code Playgroud)
是否有一个函数来分割换行符上的文本以产生类似这个数组的东西?
提前致谢.
我正在编写代码来解码来自二进制协议的消息.每种消息类型都分配有1字节类型标识符,每条消息都带有此类型ID.消息都以包含5个字段的公共标头开头.我的API很简单:
decoder:decode(Bin :: binary()) -> my_message_type() | {error, binary()}`
Run Code Online (Sandbox Code Playgroud)
我的第一直觉是通过为每种消息类型编写一个解码函数来严重依赖模式匹配,并在fun参数中完全解码该消息类型
decode(<<Hdr1:8, ?MESSAGE_TYPE_ID_X:8, Hdr3:8, Hdr4:8, Hdr5:32,
TypeXField1:32, TypeXFld2:32, TypeXFld3:32>>) ->
#message_x{hdr1=Hdr1, hdr3=Hdr3 ... fld4=TypeXFld3};
decode(<<Hdr1:8, ?MESSAGE_TYPE_ID_Y:8, Hdr3:8, Hdr4:8, Hdr5:32,
TypeYField1:32, TypeYFld2:16, TypeYFld3:4, TypeYFld4:32
TypeYFld5:64>>) ->
#message_y{hdr1=Hdr1, hdr3=Hdr3 ... fld5=TypeYFld5}.
Run Code Online (Sandbox Code Playgroud)
请注意,虽然消息的前5个字段在结构上相同,但之后的字段因每种消息类型而异.
我有大约20种消息类型,因此有20种类似于上面的功能.我用这种结构多次解码完整的消息?这是惯用的吗?我只是解码函数头中的消息类型字段然后解码消息正文中的完整消息会更好吗?
我正在开发一个Python库,它对长位字符串执行许多按位操作,我想找到一个能够最大化其速度的位串类型.我已经尝试了内置的Python int类型,numpy,bitstring和bitarray,而且令人惊讶的是,当涉及到按位操作时,Python int似乎赢了.我用google搜索的所有内容都说numpy对于像这样的矢量化操作要快得多.我是不是以某种方式使用了numpy错误?我可以使用另一个Python库,它实际上改进了Python的内置int类型吗?
from timeit import timeit
import random
size = 10000
def int_to_bits(i):
result = []
for _ in range(size):
result.append(i % 2)
i >>= 1
return result
x = random.randrange(2**size)
y = random.randrange(2**size)
print(x.bit_length(), y.bit_length())
x_bits = int_to_bits(x)
y_bits = int_to_bits(y)
t = timeit(
stmt='a & b',
setup='a = %d; b = %d' % (x, y)
)
print("raw ints:", t)
t = timeit(
stmt='a & b',
setup=('import numpy;'
'a = numpy.array(%r, dtype=int);' …Run Code Online (Sandbox Code Playgroud) 如何让pandas附加一个整数并保留整数数据类型?在我输入数据之后我意识到我可以将df.test.astype(int)添加到整个列但是如果我可以在我追加数据的时候这样做,那么这似乎是更好的方法.这是一个示例:
from bitstring import BitArray
import pandas as pd
df = pd.DataFrame()
test = BitArray('0x01')
test = int(test.hex)
print(test)
df = df.append({'test':test, 'another':5}, ignore_index=True)
print(df.test)
print(df.another)
Run Code Online (Sandbox Code Playgroud)
这是输出:
1
0 1.0
Name: test, dtype: float64
0 5.0
Name: another, dtype: float64
Run Code Online (Sandbox Code Playgroud)
它将整数更改为浮点数.
是否有将二进制(0 | 1)numpy数组转换为整数或二进制字符串的快捷方式?铁
b = np.array([0,0,0,0,0,1,0,1])
=> b is 5
np.packbits(b)
Run Code Online (Sandbox Code Playgroud)
但只适用于8位值..如果numpy是9个或更多元素,它会生成2个或更多8位值.另一种选择是返回一个0 | 1的字符串......
我现在做的是:
ba = bitarray()
ba.pack(b.astype(np.bool).tostring())
#convert from bitarray 0|1 to integer
result = int( ba.to01(), 2 )
Run Code Online (Sandbox Code Playgroud)
这很难看!
在Erlang shell中,我可以执行以下操作:
A = 300.
300
<<A:32>>.
<<0, 0, 1, 44>>
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试以下内容时:
B = term_to_binary({300}).
<<131,104,1,98,0,0,1,44>>
<<B:32>>
** exception error: bad argument
<<B:64>>
** exception error: bad argument
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,我采用整数并使用bitstring语法将其放入32位字段.这按预期工作.在第二种情况下,我使用term_to_binaryBIF将元组转换为二进制,我尝试使用bitstring语法解压缩某些位.为什么第一个例子有效,但第二个例子失败了?看起来他们都做了非常相似的事情.
我想从文件中读取尽可能多的24位块. 如果我现在没有多少个块,我怎么能使用位串的' ConstBitStream?
目前我这样做:
eventList = ConstBitStream(filename = 'events.dat')
for i in range(1000) :
packet = eventList.read(24)
Run Code Online (Sandbox Code Playgroud)
(这里我必须预先计算事件的数量)
Elixir有一个函数接受整数和浮点数并将它们转换为字符串吗?
我需要这样的东西:
a = 3
b = 3.14
number_to_binary(a)
% => "3"
number_to_binary(b)
% => "3.14"
Run Code Online (Sandbox Code Playgroud)
Elixir中有没有这样的功能呢?我查看了文档但没有看到任何内容.我还检查了Erlang文档,但也没有看到任何类似的函数.
我有一个包含1列的pandas Dataframe,其中包含一串位,例如.'100100101'.我想将此字符串转换为numpy数组.
我怎样才能做到这一点?
编辑:
运用
features = df.bit.apply(lambda x: np.array(list(map(int,list(x)))))
#...
model.fit(features, lables)
Run Code Online (Sandbox Code Playgroud)
导致错误model.fit:
ValueError: setting an array element with a sequence.
Run Code Online (Sandbox Code Playgroud)
由于有明确的答案,我想出的解决方案适用于我的案例:
for bitString in input_table['Bitstring'].values:
bits = np.array(map(int, list(bitString)))
featureList.append(bits)
features = np.array(featureList)
#....
model.fit(features, lables)
Run Code Online (Sandbox Code Playgroud)