首页 > 解决方案 > 以不同的方式获取和设置 np.array 元素

问题描述

我有一个 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)

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

标签: python-2.7numpyindexing

解决方案


在 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。谢谢你的支持。


推荐阅读