以不同的方式获取和设置np.array元素

时间:2019-10-29 10:48:52

标签: python-2.7 numpy indexing

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

但是它不允许我设置元素。我该如何运作?如果这是不可能的,那么允许以这两种不同方式获取和设置数组元素的最佳替代方法是什么?

1 个答案:

答案 0 :(得分: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以外的括号。感谢您的支持。