【发布时间】:2020-05-01 23:53:56
【问题描述】:
这已经困扰我一段时间了,但我还没有真正找到令人满意的解决方案。
如果你声明一个包含字符串的字段的结构化数组,你如何设置该字段的dtype 某个值,这样你就不必担心该字段中字符串的长度?
有了floats 和ints 就容易多了。到目前为止,我一直使用 'i4' 或 'f4' 作为各自的 dtypes 并且从未遇到任何问题(尽管我不确定这是否是不好的做法,请随时指出)。在不太可能的情况下,对于这些 dtypes 来说,数字实际上太长了,Python 通过提高 OverflowError 来告诉我。但如果一根弦太长,它就会被无声地切断。
有什么方法可以声明字符串 dtype,这样您就不必在创建之前确切知道要在结构化数组中存储的字符串(将要)多长时间?我的意思是你总是可以猜测并假设'U30' 可能就足够了,并希望最好,但我真的不喜欢那样。到目前为止,我的解决方法一直是使用对象 dtype 'O',因为它只需要任何东西,但我也从来没有真正喜欢过。
我认为在ints 或floats 的情况下,您也可以使用ìnt 和float 作为数据类型,而不必担心存储数据所需的位数。为什么在使用 str 作为 dtype 时对字符串的实现方式不同?我关注了这个chain of posts,在github issue中解释了str dtype默认为空字符串,如果我没记错的话。
根据data type objects 上的numpy 文档:
要在 Python 3 中使用实际字符串,请使用
U或np.unicode_。
所以我想我在下面的示例中尝试了几件事,但是(正如预期的那样)它们都不起作用。
import numpy as np
array = np.array(
[
('Apple', 'green', 'round', 'fresh', 'good', 10e4, np.pi)], dtype=[
('fruit', np.str_), ('color', np.unicode_), ('shape', np.dtype(str)),
('state', str), ('taste', 'U2'), ('weight', 'i4'), ('radius', float)
]
)
# this causes OverflowError: Python int too large to convert to C long
# array[0]['weight'] = 10e10
# this is just 'ignored'
array[0]['color'] = 'red'
print(array)
【问题讨论】:
标签: python arrays python-3.x numpy structured-array