切割结构化的numpy数组

时间:2014-11-06 14:47:21

标签: python arrays numpy

Hello numpy the world of the world。我想为以下任务找到更好的解决方案。 一个有结构化数组:

from pylab import *
data    = np.zeros((3,),dtype=( [('value1', 'i4'), ('value2', 'f4'),('name','S6')] ) )
data[:] = [(1,2.,'Hello'),(2,3.,"World"), (4, 5, "year")]

我经常在数据数组中找到我自己搜索的行:

line  = data[data["name"]=="World"]

我想要做的下一件事就是用“名字”去除线条。所以我这样做:

names = line.dtype.names
sline = line[ [name for name in names][:-1] ]

获取值

result = sline[0]
print result
(2, 3.0)

正如您所看到的,这是一种相对复杂且不太可读的方式。 问题是,结构化数组的一行不可切片(行[0] [: - 1]不起作用)。 这导致带有名称的行和需要循环它们以便能够切割。 如果数据是没有结构的普通numpy数组,所有这一切都会更容易,因为这里可以使用强大的剪切语法。 另一方面,我喜欢通过调用名称而不是隐藏的索引号来查找结构化数组中的值的可能性。它代表我的数据只是为了放弃它。 那么有没有一种更好的方法来减少行和列中的结构化数组而不将其转换为普通的numpy数组?

Cheerse

2 个答案:

答案 0 :(得分:1)

我发现Pandas DataFrame s:

更容易
import pandas as pd
a=pd.DataFrame(data)
a
   value1  value2   name
0       1       2  Hello
1       2       3  World
2       4       5   year

a[a.name=='World']
   value1  value2   name
1       2       3  World

答案 1 :(得分:1)

由于您的数据是结构化的,访问这样的值会不会更容易?

# get that array row
data[data['name']=='World'][0]
(2, 3.0, 'World')

# get individual value
data[data['name']=='World'][0][0]
2

更新

要访问多个记录,您还可以使用切片甚至列表推导,如下所示:

data[data['name'] != ''][1:]
array([(2, 3.0, 'World'), (4, 5.0, 'year')], 
      dtype=[('value1', '<i4'), ('value2', '<f4'), ('name', 'S6')])

data[data['name'] != ''][1:][1][0]
4

print [x[1] for x in data[data['name'] != ''][1:]]
[3.0, 5.0]