numpy中结构化数组的形状

Shape of a structured array in numpy

我正在尝试预分配一个空数组,同时使用以下代码定义大小为 19x5 的数据类型:

import numpy as np
arr=np.empty((19,5),dtype=[('a','|S1'),('b', 'f4'),('c', 'i'),('d', 'f4'),('e', 'f4')])

结果有点出乎意料,得到了一个19*5*5的数组。 但是,尝试:

arr=np.empty((19,1),dtype=[('a','|S1'),('b', 'f4'),('c', 'i'),('d', 'f4'),('e', 'f4')])

给出每行的适当长度(5 个字段),这显然看起来像一维数组。

当我试图写这个时,只允许这种格式:

np.savetxt(file, arr, delimiter=',', fmt='%s')

这告诉我我正在处理单个字符串。 有没有办法得到一个没有展平的19x5形状的结构化数组?

主要问题出现在用savetxt写这个的时候。我想要一个包含所有 5 列值的 csv 文件。由于这是作为字符串处理的,因此会给出错误的输出。

通常,结构化数组的字段会替换二维数组的列。人们经常用 genfromtxt 加载 csv 并想知道为什么结果是 1d。正如您所发现的,您可以使用复合 dtype 制作一个二维数组,但每个元素将具有多个值 - 如 dtype.

所指定

通常你会用一维形状初始化那个数组,例如(19,)

请注意,您必须按字段或元组列表填充值。

我没有使用 savetxt 结构化数组的经验,因此无法 运行 在此平板电脑上进行测试。但可能有 SO 问题会有所帮助。

savetxt 迭代数组,并写入 fmt%tuple(row),其中 fmt 是根据您的输入构建的。

我建议尝试 fmt='%s %s. %s. %s %s' - dtype 中每个字段的 % 格式。请参阅其文档。我也不知道 (19,) 数组是否会比 (19,1) 更好。

尝试格式化数组的元素。对于格式化程序,它们应该看起来像元组。如果没有尝试 tolist()tuple(A[0]).

这里的答案几乎可以重复

 ab = np.zeros(names.size, dtype=[('var1', 'S6'), ('var2', float)])
 np.savetxt('test.txt', ab, fmt="%10s %10.3f")

===================

由于元组格式,

savetxt 只能处理一维结构化数组。