当前位置: 首页 > 面试题库 >

子类化numpy ndarray问题

闾丘玮
2023-03-14
问题内容

我想继承numpy ndarray。但是,我无法更改数组。为什么self = ...不更改数组?谢谢。

import numpy as np

class Data(np.ndarray):

    def __new__(cls, inputarr):
        obj = np.asarray(inputarr).view(cls)
        return obj

    def remove_some(self, t):
        test_cols, test_vals = zip(*t)
        test_cols = self[list(test_cols)]
        test_vals = np.array(test_vals, test_cols.dtype)

        self = self[test_cols != test_vals] # Is this part correct?

        print len(self) # correct result

z = np.array([(1,2,3), (4,5,6), (7,8,9)],
    dtype=[('a', int), ('b', int), ('c', int)])
d = Data(z)
d.remove_some([('a',4)])

print len(d)  # output the same size as original. Why?

问题答案:

也许使它成为一个函数,而不是一个方法:

import numpy as np

def remove_row(arr,col,val):
    return arr[arr[col]!=val]

z = np.array([(1,2,3), (4,5,6), (7,8,9)],
    dtype=[('a', int), ('b', int), ('c', int)])

z=remove_row(z,'a',4)
print(repr(z))

# array([(1, 2, 3), (7, 8, 9)], 
#       dtype=[('a', '<i4'), ('b', '<i4'), ('c', '<i4')])

或者,如果您希望将其用作方法,

import numpy as np

class Data(np.ndarray):

    def __new__(cls, inputarr):
        obj = np.asarray(inputarr).view(cls)
        return obj

    def remove_some(self, col, val):
        return self[self[col] != val]

z = np.array([(1,2,3), (4,5,6), (7,8,9)],
    dtype=[('a', int), ('b', int), ('c', int)])
d = Data(z)
d = d.remove_some('a', 4)
print(d)

此处的主要区别在于,remove_some它不尝试修改self,而仅返回的新实例Data



 类似资料:
  • 原文:Subclassing ndarray 介绍 子类化ndarray相对简单,但与其他Python对象相比,它有一些复杂性。 在这个页面上,我们解释了允许你子类化ndarray的机制,以及实现子类的含义。 ndarrays和对象创建 ndarray的子类化很复杂,因为ndarray类的新实例可以以三种不同的方式出现。 这些是: 显式构造函数调用 - 如MySubClass(params)。 这

  • 创建基于对话框的应用程序主要是使用子类化 QDialog 的方法。在本节,我们采用这个方法创建一个稍微复杂的实例-可扩展对话框。 可扩展对话框通常只显示简单的外观,但是它还有一个切换按钮( toggle button), 可以让用户在对话框的简单外观和扩展外观之间来回切换。 可扩展对话框通常用于试图同时 满足普通用户和高级用户需要的应用程序中,这种应用程序通常会隐藏那些高级选项,除非 用户明确要求

  • 问题内容: 给这篇Dobbs博士文章,尤其是Builder模式,我们如何处理将Builder子类化的情况?以该示例的简化版本为例,在该示例中我们想使用子类来添加GMO标签,一个简单的实现将是: 子类: 现在,我们可以编写如下代码: 但是,如果我们弄错了订单,那么一切都会失败: 问题当然是NutritionFacts.Builder返回a NutritionFacts.Builder,而不是a GM

  • 问题内容: 我是java的新手,我试图创建一个XML文档并一遍又一遍地克隆此文档的特定节点(减去textnode)。有人回答了我,说我应该继承节点的子类并覆盖克隆。所以我的问题是 什么是子分类? 问题答案: @Charlie Martin解释了子类化的含义。 但是,尚不清楚您是否得到了很好的建议。如果要通过在内存中组装DOM来创建XML文档,则更好的方法将是使用静态方法创建一个助手类,该类执行需要

  • 本文向大家介绍sprite-kit 子类化SKSpriteNode,包括了sprite-kit 子类化SKSpriteNode的使用技巧和注意事项,需要的朋友参考一下 示例 您可以子类化SKSpriteNode并定义自己的精灵类型。