gpt4 book ai didi

python - recarray 中的自动字符串长度

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:14 26 4
gpt4 key购买 nike

如果我以这种方式创建一个 recarray:

In [29]: np.rec.fromrecords([(1,'hello'),(2,'world')],names=['a','b'])

结果看起来不错:

Out[29]: 
rec.array([(1, 'hello'), (2, 'world')],
dtype=[('a', '<i8'), ('b', '|S5')])

但是如果我想指定数据类型:

In [32]: np.rec.fromrecords([(1,'hello'),(2,'world')],dtype=[('a',np.int8),('b',np.str)])

字符串的长度设置为零:

Out[32]: 
rec.array([(1, ''), (2, '')],
dtype=[('a', '|i1'), ('b', '|S0')])

我需要为所有数字类型指定数据类型,因为我关心 int8/16/32 等,但如果我不指定数据类型,我想从自动字符串长度检测中受益。我尝试用 None 替换 np.str 但没有运气。例如,我知道我可以指定 '|S5',但我事先不知道字符串长度应该设置为多少。

最佳答案

如果您不需要将字符串作为字节来操作,您可以使用对象数据类型来表示它们。这实际上存储了一个指针而不是实际的字节:

In [38]: np.array(data, dtype=[('a', np.uint8), ('b', np.object)])
Out[38]:
array([(1, 'hello'), (2, 'world')],
dtype=[('a', '|u1'), ('b', '|O8')])

或者,Alex 的想法会很有效:

new_dt = []

# For each field of a given type and alignment, determine
# whether the field is an integer. If so, represent it as a byte.

for f, (T, align) in dt.fields.iteritems():
if np.issubdtype(T, int):
new_dt.append((f, np.uint8))
else:
new_dt.append((f, T))

new_dt = np.dtype(new_dt)
np.array(data, dtype=new_dt)

应该产生

array([(1, 'hello'), (2, 'world')], 
dtype=[('f0', '|u1'), ('f1', '|S5')])

关于python - recarray 中的自动字符串长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1664917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com