【发布时间】: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