今天在学习Numpy 自定义数据格式对象遇到一个这样的问题:
Traceback (most recent call last):
File "e:\py_workspace\conda-demo\numpy-2.py", line 33, in
b = np.array([('zzg', 32, 16357.50, "横岗街道"),('zzx', 28, 13856.80, "西乡街道")], dtype = employ)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
Python 数据格式定义对象源码:
# 定义一个结构化的数据类型对象
employ = np.dtype([("name", "S20"),("age", "i1"),("salary", "f2"),("address", "S20")])
print(employ)
#将其应用于ndarray对象
b = np.array([('zzg', 32, 16357.50, "横岗街道"),('zzx', 28, 13856.80, "西乡街道")], dtype = employ)
print(b)
# 输出ndarray 对象 name 属性
print(b["name"])
# 输出ndarray 对象 age 属性
print(b["age"])
# 输出ndarray 对象 salary 属性
print(b["salary"])
# 输出ndarray 对象 address 属性
print(b["address"])
上面代码中,定义了一个结构数组employ ,实际上S20用的是numpy中的字符编码来表示数据类型的定义,比如i代表整数,f代表单精度浮点数,S代表字符串,S20代表的是32个字符的字符串。
字符 | 对应类型 |
---|---|
b | 代表布尔型 |
i | 带符号整型 |
u | 无符号整型 |
f | 浮点型 |
c | 复数浮点型 |
m | 时间间隔(timedelta) |
M | datatime(日期时间) |
O | Python对象 |
S,a | 字节串(S)与字符串(a) |
U | Unicode |
V | 原始数据(void) |
如果使用中文,需要把数据类型设置为U20
# 定义一个结构化的数据类型对象
employ = np.dtype([("name", "S20"),("age", "i1"),("salary", "f2"),("address", "U20")])
print(employ)
#将其应用于ndarray对象
b = np.array([('zzg', 32, 16357.50, "横岗街道"),('zzx', 28, 13856.80, "西乡街道")], dtype = employ)
print(b)
# 输出ndarray 对象 name 属性
print(b["name"])
# 输出ndarray 对象 age 属性
print(b["age"])
# 输出ndarray 对象 salary 属性
print(b["salary"])
# 输出ndarray 对象 address 属性
print(b["address"])
数据结果:
PS E:\py_workspace\conda-demo>
> & D:/anaconda3/envs/python310/python.exe e:/py_workspace/conda-demo/numpy-2.py
[('score', 'i1')]
[(1,) (3,) (5,) (7,) (9,)]
[('score', 'i1')]
[1 3 5 7 9]
[('name', 'S20'), ('age', 'i1'), ('salary', '