【发布时间】:2021-04-20 22:13:34
【问题描述】:
我正在尝试使用结构化的 numpy 数组设置共享内存缓冲区。
如果我只使用 (datetime's, int's, float's) 或 (string's, int's, float's) 我没有问题。但是,如果我尝试使用 (string's, datetime's, int's, float's),我会遇到“TypeError: buffer is too small for requested array”错误。
想知道为什么这不起作用。任何帮助表示赞赏。
这行得通:
import numpy as np
from datetime import datetime
N_list_size = 100_000
a = [
(datetime.now(),
np.uint64(1234),
np.float64("123.4"))
] * N_list_size
np_array = np.ndarray(shape=(N_list_size,),
buffer=np.array(a),
dtype=[
('a', np.datetime64),
('b', np.uint64),
('c', np.float64),
])
shape, dtype = np_array.shape, np_array.dtype
print(f"np_array's size = {np_array.nbytes / 1e6}MB")
print(f"np_array's dtype = {dtype}")
这也有效:
import numpy as np
from datetime import datetime
N_list_size = 100_000
a = [
("d50ec984-77a8-460a-b958-66f114b0de9b",
np.uint64(1234),
np.float64("123.4"))
] * N_list_size
np_array = np.ndarray(shape=(N_list_size,),
buffer=np.array(a),
dtype=[
('a', np.str_, 36),
('b', np.uint64),
('c', np.float64),
])
shape, dtype = np_array.shape, np_array.dtype
print(f"np_array's size = {np_array.nbytes / 1e6}MB")
print(f"np_array's dtype = {dtype}")
这不起作用:
import numpy as np
from datetime import datetime
N_list_size = 100_000
a = [
("d50ec984-77a8-460a-b958-66f114b0de9b",
datetime.now(),
np.uint64(1234),
np.float64("123.4"))
] * N_list_size
np_array = np.ndarray(shape=(N_list_size,),
buffer=np.array(a),
dtype=[
('a', np.str_, 36),
('b', np.datetime64),
('c', np.uint64),
('d', np.float64),
])
shape, dtype = np_array.shape, np_array.dtype
print(f"np_array's size = {np_array.nbytes / 1e6}MB")
print(f"np_array's dtype = {dtype}")
失败:
TypeError: buffer is too small for requested array
为什么在这里同时使用日期时间和字符串会导致问题?
如何解决这个问题?
【问题讨论】:
-
不确定,但指定日期时间的单位似乎可行:
np_array = np.array(a, dtype=[('a', 'U36'), ('b', 'datetime64[m]'), ('c', np.uint64), ('d', np.float64)]) -
您也可以使用日期的字符串表示,而不是使用 python 的日期时间。只需使用
str(datetime.now())而不是datetime.now()。使用日期时间作为字符串通常更方便 imo -
datetune.now()创建一个 Python 数据时间对象。这与np.datetime64元素不同。 -
当我尝试显示第一个
np_array(对于少数元素)时,我收到一个关于通用datetime64显示的 ValueError。即使我纠正了我仍然得到相对无意义的值显示。 -
np.array(a)创建一个对象 dtype 数组。也就是说,它包含指向内存中其他位置的对象的指针。您无法将这些指针有意义地视为float64、int等。测试这是非常小的数组,您可以详细检查这些数组。仅仅检查 shape 和 dtype 是不够的!
标签: python numpy shared-memory numpy-ndarray