以类似字典的方式将新项目添加到某些结构化数组中

2024-05-03

我想扩展 numpy 中的结构化数组对象,以便我可以轻松添加新元素。

例如,对于一个简单的结构化数组

>>> import numpy as np
>>> x=np.ndarray((2,),dtype={'names':['A','B'],'formats':['f8','f8']})
>>> x['A']=[1,2]
>>> x['B']=[3,4]

我想轻松添加一个新元素x['C']=[5,6],但随后会出现与未定义名称相关的错误'C'.

只需添加一个新方法即可np.ndarray works:

import numpy as np
class sndarray(np.ndarray):
    def column_stack(self,i,x):
        formats=['f8']*len(self.dtype.names)
        new=sndarray(shape=self.shape,dtype={'names':list(self.dtype.names)+[i],'formats':formats+['f8']})
        for key in self.dtype.names:
            new[key]=self[key]

        new[i]=x

        return new

Then,

>>> x=sndarray((2,),dtype={'names':['A','B'],'formats':['f8','f8']})
>>> x['A']=[1,2]
>>> x['B']=[3,4]
>>> x=x.column_stack('C',[4,4])
>>> x
sndarray([(1.0, 3.0, 4.0), (2.0, 4.0, 4.0)], 
  dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

有没有什么方法可以以类似字典的方式添加新元素?,例如

>>> x['C']=[4,4]
>>> x
sndarray([(1.0, 3.0, 4.0), (2.0, 4.0, 4.0)], 
  dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

Update:

通过使用__setitem__我距离理想的解决方案还差一步,因为我不知道如何:

更改 self 引用的对象

import numpy as np

class sdarray(np.ndarray):
    def __setitem__(self, i,x):
    if i in self.dtype.names:
        super(sdarray, self).__setitem__(i,x)
    else:
        formats=['f8']*len(self.dtype.names)
        new=sdarray(shape=self.shape,dtype={'names':list(self.dtype.names)+[i],'formats':formats+['f8']})
        for key in self.dtype.names:
           new[key]=self[key]

        new[i]=x

        self.with_new_column=new

Then

>>> x=sndarray((2,),dtype={'names':['A','B'],'formats':['f8','f8']})
>>> x['A']=[1,2]
>>> x['B']=[3,4]
>>> x['C']=[4,4]
>>> x=x.with_new_column #extra uggly step!
>>> x
sndarray([(1.0, 3.0, 4.0), (2.0, 4.0, 4.0)], 
  dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

Update 2在所选答案中正确实施后,我发现问题已经解决了pandas DataFrame object:

>>> import numpy as np
>>> import pandas as pd
>>> x=np.ndarray((2,),dtype={'names':['A','B'],'formats':['f8','f8']})
>>> x=pd.DataFrame(x)
>>> x['A']=[1,2]
>>> x['B']=[3,4]
>>> x['C']=[4,4]
>>> x
   A  B  C
0  1  3  4
1  2  4  4
>>> 

Use numpy.recarray相反,在我的numpy 1.6.1你会得到一个额外的方法field当您继承时不存在numpy.ndarray.

这个问题 https://stackoverflow.com/questions/1201817/adding-a-field-to-a-structured-numpy-array or 这个(如果使用 numpy 1.3) https://stackoverflow.com/questions/5288736/adding-a-field-to-a-structured-numpy-array-2还讨论添加一个字段structured array。从那里您将看到使用:

import numpy.lib.recfunctions as rf
rf.append_fields( ... )

可以大大简化您的生活。乍一看,我以为这个函数会附加到原始数组,但它创建了一个新实例。这class下面显示的是使用您的解决方案__setitem__(),效果很好。

您发现导致您找到丑陋解决方案的问题是在另一个问题中报道过 https://stackoverflow.com/questions/5149269/subclassing-numpy-ndarray-problem。问题是当你这样做时self=...你只是存储new变量中的对象,但实体sdarray没有更新。也许可以直接破坏并重建class从其方法内部,但基于that https://stackoverflow.com/questions/5149269/subclassing-numpy-ndarray-problem讨论以下内容class可以创建,其中ndarray不是子类化的,而是在内部存储和调用的。添加了一些其他方法以使其工作并且看起来就像您正在直接使用ndarray。我没有详细测试。

用于自动调整大小这里提出了很好的解决方案 https://stackoverflow.com/questions/6405342/automatically-resizing-numpy-recarray。您还可以将其合并到您的代码中。

import numpy as np

class sdarray(object):
    def __init__(self, *args, **kwargs):
        self.recarray =  np.recarray( *args, **kwargs)

    def __getattr__(self,attr):
        if hasattr( self.recarray, attr ):
            return getattr( self.recarray, attr )
        else:
            return getattr( self, attr )

    def __len__(self):
        return self.recarray.__len__()

    def __add__(self,other):
        return self.recarray.__add__(other)

    def __sub__(self,other):
        return self.recarray.__sub__(other)

    def __mul__(self,other):
        return self.recarray.__mul__(other)

    def __rmul__(self,other):
        return self.recarray.__rmul__(other)

    def __getitem__(self,i):
        return self.recarray.__getitem__(i)

    def __str__(self):
        return self.recarray.__str__()

    def __repr__(self):
        return self.recarray.__repr__()

    def __setitem__(self, i, x):
        keys = []
        formats = []
        if i in self.dtype.names:
            self.recarray.__setitem__(i,x)
        else:
            for name, t in self.dtype.fields.iteritems():
                keys.append(name)
                formats.append(t[0])
            keys.append( i )
            formats.append( formats[-1] )
            new = np.recarray( shape = self.shape,
                              dtype = {'names'  : keys,
                                       'formats': formats} )
            for k in keys[:-1]:
                new[k] = self[k]
            new[i] = x
            self.recarray = new
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以类似字典的方式将新项目添加到某些结构化数组中 的相关文章

随机推荐

  • Git Grep 颜色选项解释和/或比较

    我正在尝试自定义我的 Git 颜色 读完后文档 https git scm com docs git config 我找到了我想要设置的选项 除了 Grep 之外 一切都工作正常 我意识到 我过去并没有真正使用过它 我想用相同的调色板为其设
  • Pytorch 损失为 nan

    我正在尝试用 pytorch 编写我的第一个神经网络 不幸的是 当我想要得到损失时遇到了问题 出现以下错误信息 RuntimeError Function LogSoftmaxBackward0 returned nan values in
  • 为什么 RVO 不应用于基类子对象初始化?

    为什么移动构造函数是Base在继承的情况下是强制性的 class B 在下面的代码中 在 gcc 7 2 和 clang 4 0 中 我希望 C 17 中保证复制省略不需要它 就像组合的情况一样 class A struct Base Ba
  • 如何使用 ibrowse 将附件上传到 CouchDB 中的文档?

    我已经使用curl上传图像文件Penguins jpg 例如 C curl gt curl vX PUT H Content Type image jpeg http localhost 5984 DBNAME DOCID Penguins
  • 从数据集中提取唯一的产品 ID 和相应的其他列值到新工作表

    我有一个宏 可以从 A 列 中提取唯一数据 但我也希望从 A 列中的这些唯一值的其他列中获取相应的值 并且我希望它们位于不同的电子表格中 我尝试在代码中使用 Worksheet Vlookup 函数 但对于超过 70 000 行和 42 列
  • 如何将已编译的 IPA 复制到我的 iOS 设备?

    我有一个开发者帐户 并且习惯于编写自己的应用程序 最近 与我合作的另一位开发人员希望我在我的设备上测试他们的应用程序 他已经将我的设备 ID 添加到他的配置文件中 并为我提供了编译后的 IPA 但我不知道如何将此 IPA 复制到我的 iOS
  • 仅显示帖子的子类别

    我有一个自定义帖子 我想显示它所属的所有类别 这有两个部分 在页面顶部 我只显示它所属的顶级类别 这就是我的做法 div class type block span class type initial span div
  • php oop 如何使用属性和方法形成类

    我是 php oop 的新手 我对类有一些想法 但我仍然不知道如何在创建的对象中使用它的属性和方法 我需要了解下面报告的代码是否正确 如果不正确我做错了什么 我假设我有一个可以为我做任何事情的课程 我们称之为 Class myClass 现
  • 如何使财产成为财产

    我不太确定如何表达这个问题 所以我将举例说明 我想为房产做房产 我目前正在使用不同类别的属性 player Player alloc init player name PlayerName 这些属性在 Player 类中定义 并导入 Pla
  • 在 C++/CLI 中使用 EventHandler

    我正在尝试使用 c cli 中的事件处理程序来引发事件 然后在 c 中订阅它 class Mclass event System EventHandler someEvent void ShowMessage System String s
  • 如何检测 Mac OS X 是否正在虚拟机内运行

    我不希望我的应用程序在 Mac 上的虚拟机内运行 如何从我的 Mac 应用程序中检测到它 Windows 和 Linux 的解决方案非常简单 并在其他类似问题中详细讨论 我不介意执行 system profiler or ioreg 找出来
  • 确定执行脚本的路径

    我有一个名为foo R其中包括另一个脚本other R 位于同一目录中 usr bin env Rscript message Hello source other R 但我想要R找到那个other R无论当前工作目录是什么 换句话说 fo
  • 在 Nifi 中使用“DBCPConnectionPoolLookup”服务时出现异常“无法获取连接,池错误超时等待空闲对象”

    我正在尝试使用 ExecuteGroovyScript 中的 DBCPConnectionPoolLookup 服务根据输入流文件中的 database name 参数动态查询所需的数据库 处理器能够成功获取相应的 DBCPConnecti
  • 如果 WooCommerce 购物车商品缺货,请勿使用优惠券

    到目前为止 这就是我所得到的 add filter woocommerce coupon is valid coupon always valid 99 2 function coupon always valid valid coupon
  • Extjs中始终显示Slider的提示文本

    在 Extjs 4 1 1a 中 如何保持tip text滑块始终可见 目前 tip text每当用户拖动滑块栏时就可见 我搜索了docs http docs sencha com ext js 4 0 api Ext slider Sin
  • 如何在 Intellij IDEA 中为 Apache Tomcat 指定自定义 JRE 路径?

    问题是如何指定自定义JRE路径为Apache tomcat in Intellij IDEA 当从以下位置启动应用程序时IDEA 看来 只需配置它的路径 路径jvm dll in Apache Tomcat监视器没有帮助 还有其他想法或方法
  • 是否可以将名为“None”的值添加到枚举类型?

    我可以将名为 None 的值添加到枚举中吗 例如 from enum import Enum class Color Enum None 0 represent no color at all red 1 green 2 blue 3 co
  • 在“选择”下拉列表中输入 2 个字符后开始搜索

    In Chosen http harvesthq github io chosen 下拉插件 在所选下拉菜单中输入 2 个字符后开始搜索 我需要在搜索框中输入至少两个字符后才开始搜索 任何人都可以建议如何做到这一点吗 我做了一个小改变 在第
  • 检查与 NSURLConnection 连接的有效 IP

    我目前有一个应用程序 它尝试根据我正在与之通信的某些服务器打开网络视图 但是 我允许用户输入自己的服务器 IP 以防 iphone ipad 和服务器 或其他设备 不在同一网络上 但是 我尝试使用 NSURLConnection 来检测是否
  • 以类似字典的方式将新项目添加到某些结构化数组中

    我想扩展 numpy 中的结构化数组对象 以便我可以轻松添加新元素 例如 对于一个简单的结构化数组 gt gt gt import numpy as np gt gt gt x np ndarray 2 dtype names A B fo