python - 切割结构化 numpy 数组

标签 python arrays numpy

世界各地的 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/

相关文章:

python - 类 CharField() 的参数

java - Sl4a运行Tasker任务并传递变量

arrays - 遍历数组只获取 Swift Playground 中的第一个值

python - 如何用固定点进行多项式拟合

pandas - 如何对具有偏移量的向量应用操作

python-3.x - 如何使用接受一个输入并输出标量值的函数来初始化等高线图的数据?

python - Excel 使用 Python Pandas 合并 2 个工作表中的单元格

python - boto3 iam 客户端 : get policy by name

python - 没有名为 main 的模块,wkhtmltopdf 问题

c - C语言如何读取文件并存入数组?