首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将字段添加到结构化numpy数组(4)

将字段添加到结构化numpy数组(4)
EN

Stack Overflow用户
提问于 2018-11-04 04:45:25
回答 1查看 209关注 0票数 2

这一点以前已经解决过(hereherehere)。我想向numpy genfromtxt返回的结构数组中添加一个新字段(也询问了here)。

我的新问题是,我正在读取的csv文件只有一个标题行和一个数据行:

output-Summary.csv

代码语言:javascript
运行
复制
Wedge, DWD, Yield (wedge), Efficiency
1, 16.097825, 44283299.473156, 2750887.118836

我正在通过genfromtxt读取它并计算一个新的值'tl'

代码语言:javascript
运行
复制
test_out = np.genfromtxt('output-Summary.csv', delimiter=',', names=True)
tl = 300 / test_out['DWD']

test_out看起来是这样的:

代码语言:javascript
运行
复制
array((1., 16.097825, 44283299.473156, 2750887.118836),
      dtype=[('Wedge', '<f8'), ('DWD', '<f8'), ('Yield_wedge', '<f8'), ('Efficiency', '<f8')])

使用recfunctions.append_fields (如上面的示例1-3中所建议的那样)在使用大小为1的数组时使用len()失败:

代码语言:javascript
运行
复制
from numpy.lib import recfunctions as rfn
rfn.append_fields(test_out,'tl',tl)

TypeError: len() of unsized object

寻找替代方案(答案之一here),我发现mlab.rec_append_fields工作得很好(但不推荐):

代码语言:javascript
运行
复制
mlab.rec_append_fields(test_out,'tl',tl)

C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: MatplotlibDeprecationWarning: The rec_append_fields function was deprecated in version 2.2.
  """Entry point for launching an IPython kernel.
代码语言:javascript
运行
复制
rec.array((1., 16.097825, 44283299.473156, 2750887.118836, 18.63605798),
          dtype=[('Wedge', '<f8'), ('DWD', '<f8'), ('Yield_wedge', '<f8'), ('Efficiency', '<f8'), ('tl', '<f8')])

我还可以按照建议的here,将数组复制到一个新的结构化数组中。这样做是可行的:

代码语言:javascript
运行
复制
test_out_new = np.zeros(test_out.shape, dtype=new_dt)
for name in test_out.dtype.names:
    test_out_new[name]=test_out[name]
test_out_new['tl']=tl

总之,是否有一种方法可以让recfunctions.append_fields处理我的一行csv文件中的genfromtxt输出?我宁愿用一种标准的方法来处理这个问题,也不愿用一种自制的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-04 05:04:23

将数组(和新字段)重塑为大小(1,)。只需一行,genfromtxt就会将数据加载为0d数组-- array ()。rfn代码没有被大量使用,也不像它应该的那样健壮。换句话说,“标准方式”仍然有些问题。

例如:

代码语言:javascript
运行
复制
In [201]: arr=np.array((1,2,3), dtype='i,i,i')
In [202]: arr.reshape(1)
Out[202]: array([(1, 2, 3)], dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])

In [203]: rfn.append_fields(arr.reshape(1), 't1',[1], usemask=False)
Out[203]: 
array([(1, 2, 3, 1)],
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('t1', '<i8')])

home_brew没有什么问题。大多数rfn函数都使用这种机制--定义一个新的dtype,创建一个带有该dtype的收件人数组,并按名称复制字段。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53137822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档