从字节创建固定大小元组的numpy数组的有效方法



我正在尝试将字节转换为固定大小元组的numpy数组(2或3个双元组(,它必须是1d数组。我设法得到的是:
values = np.fromstring(data, (np.double, (n,)))-它给了我形状为(105107,2(的2d阵列

array([[0.03171165, 0.03171165],
[0.03171165, 0.03171165],
[0.03020949, 0.03020949],
...,
[0.05559354, 0.16173067],
[0.12667986, 0.04522982],
[0.14062567, 0.11422881]])

values = np.fromstring(data, [('dt', np.double, (n,))])-它给了我形状为(105107,(的1d数组,但数组包含元组,其中包含具有两个双的数组

array([([0.03171165, 0.03171165],), ([0.03171165, 0.03171165],),
([0.03020949, 0.03020949],), ..., ([0.05559354, 0.16173067],),
([0.12667986, 0.04522982],), ([0.14062567, 0.11422881],)],
dtype=[('dt', '<f8', (2,))])

有什么有效的方法可以实现这样的1d阵列吗?:

array([(0.03171165, 0.03171165),
(0.03171165, 0.03171165),
(0.03020949, 0.03020949),
...,
(0.05559354, 0.16173067),
(0.12667986, 0.04522982),
(0.14062567, 0.11422881)])

不,我不知道一种有效的方法,但由于到目前为止还没有人发布任何答案,这里有一种方法至少可以为您提供所需的输出。然而,它并不有效。

values = np.fromstring(data, (np.double, (n,)))
x = np.empty(values.shape[0], dtype=np.object)
for i, a in enumerate(values):
x[i] = tuple(a)

我想补充一点,如果你有一个对象数组,它会大大否定在numpy中使用矢量化的好处,所以你不妨只使用一个列表:

values = np.fromstring(data, (np.double, (n,)))
x = [tuple(a) for a in values]

生成元组数组的一种可能的替代方法——不确定它是否更快——是通过这样一个列表,并将其转换回一个数组,这样可以故意中断转换为一个漂亮的普通二维数组,否则numpy会这样做:

values = np.fromstring(data, (np.double, (n,)))
x = [tuple(a) for a in values]
x.append(None)
y = np.array(x)[:-1]

我已经使用以下代码解决了问题:

names = ['d{i}'.format(i=i) for i in range(n)]
value = np.fromstring(data, {
'names': names,
'formats': [np.double] * n
})

最新更新