【问题标题】:Getting and setting np.array elements in a different way以不同的方式获取和设置 np.array 元素
【发布时间】:2020-02-24 14:32:38
【问题描述】:

我有一个 2D np.array。

array = np.array([[1, 2], [3, 4]])

我有一本字典。

element_ids = {1: (0, 1), 2: (1, 0), 3: (0, 0), 4: (1, 1)}

我想编写一个类,让我能够以普通方式获取和设置数组的元素

>> my_array = MyArray(array, element_ids)
>> my_array[0, 1]
1
>> my_array[0, 1] = 5
>> my_array[0, 1]
5

并使用我的字典中的 ID

>> my_array[1, 0]
3
>> my_array.by_id(2)
3
>> my_array.by_id(2) = 7
>> my_array.by_id(2)
7
>> my_array[1, 0]
7

在这种情况下,我希望my_array.by_id(i) 表现得好像我写了my_array[element_ids[i]]。 我该怎么做?

我写了一个可以双向获取元素的类

import numpy as np

class MyArray:
    def __init__(self, array, element_ids):
        self.array = array
        self.element_ids = element_ids

    def by_id(self, element_id):
        indices = self.element_ids[element_id]
        return self[indices]

    def __getitem__(self, key):
        i, j = key
        return self.array[i, j]


array = np.array([[1, 2], [3, 4]])
element_ids = {1: (0, 1), 2: (1, 0), 3: (0, 0), 4: (1, 1)}
my_array = MyArray(array, element_ids)

但它不允许我设置元素。我怎样才能让它工作?如果这是不可能的,那么允许以这两种不同方式获取和设置数组元素的最佳替代方案是什么?

【问题讨论】:

  • 分配给函数调用是语法错误。我认为没有人可以解决这个问题。
  • 也许有办法用方括号制作by_id?
  • 是的,当然。创建一个代理类By_Id 并使by_id 成为您的主类的只读属性,该属性返回一个By_Id 实例。 By_Id 将实现 __get/setitem__ 并在映射键后将所有请求转发到主类
  • 如何定义__getitem____setitem__ 来处理这两个问题。如果 key 是一个 2 元素元组,请像以前一样解压它。如果它是标量或单项元组,请使用键查找。 numpy.lib.index_tricks.py 有一些很好的自定义 get/set 方法示例。
  • @hpaulj 感谢您的建议,但我认为将两者定义在同一个地方会令人困惑,因此最好明确说明我们在这里使用 id 而不是数组中的位置。跨度>

标签: python-2.7 numpy indexing


【解决方案1】:

在 Paul Panzer 的帮助下,我设法找到了解决方案。

import numpy as np

class MyArray:
    def __init__(self, array, element_ids):
        self.array = array
        self.by_id = ById(self, element_ids)

    def __getitem__(self, key):
        i, j = key
        return self.array[i, j]

    def __setitem__(self, key, item):
        i, j = key
        self.array[i, j] = item


class ById:
    def __init__(self, my_array, element_ids):
        self.my_array = my_array
        self.element_ids = element_ids

    def __getitem__(self, key):
        return self.my_array[self.element_ids[key]]

    def __setitem__(self, key, item):
        self.my_array[self.element_ids[key]] = item

这可以按预期工作,但by_id 后面的括号而不是括号除外。感谢支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2019-04-06
    相关资源
    最近更新 更多