【问题标题】:Setting new property in Numpy array在 Numpy 数组中设置新属性
【发布时间】:2014-02-14 21:23:25
【问题描述】:

当你阅读这个问题时,你会发现我是 Python 和 NumPy 的新手,所以请原谅任何不正确的术语。

我目前正在使用两个 NumPy 数组,我们称它们为 xy

x = numpy.array(0)
y = numpy.array(0)

我正在使用将这些数组作为输入和输出的函数对这些数组进行操作。

x, y = function1(x, y)
x, y = function2(x, y)
...

这似乎不优雅,因为如果我可以让它们成为同一个对象的一部分,那么我将只有一个输入和输出到这些函数。如果可能的话,我只是想让我的代码更简单。

x = function1(x)
x = function2(x)
...

事实证明,y 描述了x 中的数据(不是在这个玩具示例中,而是使用我的实际数组)所以我想我会将y 设置为x 的属性。我的母语是 MATLAB,我想我可以使用类似于这样创建结构层次结构的语法。

x.y = y

这不起作用,不幸的是,我知道的 Python 术语不够多,无法知道在网上寻找什么来解决我的问题。

如果您有任何建议和/或我能否就这个问题提供任何澄清,请告诉我。

【问题讨论】:

  • 你为什么要向我们展示你目前正在做的一个最小的完整示例,并说几句话为什么你会找到当前的方法不满意?
  • 我不明白你的问题,NPE。你想要一个不完整的例子吗?我可以使数据更真实,但是您在上面看到的内容会重复我得到的错误。
  • this 我认为如果不继承 numpy 数组就无法做到。
  • 我不知道你为什么会这样做,这个例子并不清楚为什么你想添加y作为x的属性。这在 pandas 数据结构中是允许的。
  • 我完全不清楚你的动机。我希望一个最小但有意义的例子能够阐明您的想法,使我们能够更好地帮助您。

标签: python arrays numpy properties set


【解决方案1】:

我假设您遇到的错误类似于'array' object has no attribute 'y'

在这种情况下,如果您真的只想将这些东西捆绑在一起,我建议使用元组。以下是它们如何适用于您的用例的一些示例:

def myFunc1(x, y): 
    # do stuff with x and y
    return ??? # x or y or... both, somehow? 

def myFunc2(xy_bundle): # where xy_bundle is x and y packed into a tuple! 
    x, y = xy_bundle    # or: x = xy_bundle[0]; y = xy_bundle[1];
    # do stuff with x and y
    return (x, y)       # syntax for creating a tuple inline

您可以使用tup[x] 表示法来访问元组的各个成员,就像列表或数组一样,或者您可以隐式地使用unpack 他们,如在myFunc2 中。元组是通过函数移动多个事物的非常标准的工具,但如果您发现自己经常使用它们,您可能需要自定义类或其他东西。

正如 cmets 中所说,目前尚不清楚您想让一个数组成为另一个数组的属性的动机是什么,但这对我来说似乎是个坏主意。如果您有相互依赖的数组,您绝对可以将 pandas 的array 子类化并添加一个property。不过,似乎过于复杂。

编辑:调用这些东西!您的代码可能如下所示:

new_x = do_thing_with_array(x)
new_y = do_thing_with_array(y)

这通常会更改为:

arrs = (x, y)
new_x, new_y = do_thing_with_arrays(arrs)

希望这就是您想要的。

【讨论】:

  • 谢谢!我将不得不研究具有诸如 NumPy 数组之类的现有类的自定义类。否则,我会尝试你提到的捆绑包。只是好奇,为什么这对你来说是个坏主意?试图了解如何编写更好的 Python 代码。我的主要动机是通过减少在工作区中浮动的变量并将更少的变量传递给我的函数来编写更优雅的代码。
【解决方案2】:

您可以像这样创建一个包含两个数组的简单类。

class Xy(object):

    def __init__(self, x, y):
        self.x = x
        self.y = y 

import numpy as np 

x = np.array(range(10))
y = np.array(range(10))

xy = Xy(x,y)

def square(xy):
    x = xy.x 
    y = xy.y

    x **= 2
    y **= 2

    return Xy(x,y)

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2014-09-13
    • 1970-01-01
    • 2018-04-27
    • 2014-06-04
    • 2021-06-07
    • 2016-10-27
    • 2013-10-03
    • 1970-01-01
    相关资源
    最近更新 更多