具有多个dtypes的Numpy数组未正确格式化

时间:2014-12-10 15:15:24

标签: python python-3.x numpy

也许这是一个愚蠢的问题,但我以前从未见过这种行为,而且我不确定谷歌的正确用语!

如果我以这种方式加载我的数组:

A= np.loadtxt(csv,dtype='a100')

我得到了这种格式的东西(它是一个2D数组)。我已经习惯了这种格式,因为我知道它很快,而且我知道如何使用行和列轻松找到元素的索引。

[[a,1],[b,2]]

但是,因为我的数组有字符串和浮点数,所以当我加载数组时,我会得到不同的结果。

A= np.loadtxt(csv,dtype='a100,float')

结果:[(a,1),(b,2)]

我的目标是能够根据第一列中的字符串快速搜索数组,然后对第二列执行数值运算。

将它保存在单个dtype中是否更好,它给我索引[[]],然后以某种方式将该字符串转换为浮点数来执行数值运算然后将其写回来?

我是否仍然可以使用组合dtype执行所有相同的搜索和索引,同时仍然保持numpy的速度?

我在这里的杂草中完全没有了吗?

感谢您的任何意见。

2 个答案:

答案 0 :(得分:0)

numpy darray必须是同类的(也就是说,所有元素都必须具有相同的数据类型)。由于np,loadtxt()找到不同的值类型,因此假定您需要复杂dtype的向量而不是2-D数组。

答案 1 :(得分:0)

您可以继续使用已生成的结构化dtype。例如:

$ cat data.csv
a 1
b 3 
c 4
d 5
e 0
f 8

您可以根据第一列中的值对第二列执行操作:

>>> data = np.loadtxt('data.csv', dtype='a100,int')
>>> data.dtype
dtype([('f0', 'S100'), ('f1', '<i8')])
>>> data.dtype.names
('f0', 'f1')

由于我没有为dtype np.loadtxt参数中的列指定任何特定名称,因此numpy会自动为列分配f0f1(来自&#34; field0&#34;和&#34; field1&#34;)。

您现在可以使用基于这些字段名称的索引:

>>> def some_processing(arr):  # example function to simulate some processing
...     return (arr < 'e') & (arr > 'b')
...
>>> data['f1'][some_processing(data['f0'])]
array([4, 5])

这些结构化数组的工作方式类似于您习惯使用的典型n维数组,但它们是同构的(即所有元素属于同一类型),但您无法对数组内的数组进行分组。同一组方括号(所以没有data[:3,'f1'],但data[:3]['f1']data['f1'][:3]没问题。