世界各地的 numpy 大师们,您好。我想为以下任务找到更好的解决方案。 一个有一个结构化数组:
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)
正如你所看到的,这是一种相对复杂且可读性较差的方式。 问题是,结构化数组的一行不可切片(line[0][:-1] 不起作用)。 这导致了带有名称的行,并且需要循环它们才能剪切。 如果数据是一个没有结构的普通 numpy 数组,那么所有这一切都会更容易,因为可以在这里使用强大的切割语法。 另一方面,我喜欢通过调用名称而不是神秘的索引号来在结构化数组中查找值的可能性。它代表了我的数据,足以让我放弃它。 那么有没有更好的方法来减少行和列中的结构化数组而不将其转换为普通的 numpy 数组?
干酪
最佳答案
既然您的数据是结构化的,那么访问这样的值不是更容易吗?
# 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]
关于python - 切割结构化 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26782268/