[英]Indexing and slicing a multi-dimensional list
假设我有一个类似于任意维度的 ND 数组(让ndim
是维度数)和一个len(indexes) == ndim
的元组indexes
的嵌套列表( ndlist
)。 如果ndlist
是一个 ND 数组,我可以执行以下操作:
ndlist[indexes] = (some object)
列表的等价物是什么? 请注意, ndim
是任意的,所以我不能像这样对其进行硬编码:
ndlist[indexes[0]][indexes[1]]... = (some object)
这是ndim == 3的示例:
ndlist = [[[10, 10], [10, 10]],[[10, 10], [10, 10]]] % 3-D (2x2x2) 列表,所有元素等于 10
当我事先知道ndim 时,我可以像这样编辑ndlist的 (0,0,0) 元素:
ndlist[0][0][0] = 11 % 从 10 到 11 的变化需要 3 [0] 秒
现在假设 ndims == 4(4 维列表)。 编辑 ndlist 的 (0,0,0,0) 元素需要这样的东西:
ndlist[0][0][0][0] = 11 % 更改为 11 需要 4 [0] 秒
对于任意 ndim:
ndlist[0][0][0]...[0] = 11 %change 到 11 需要 ndim [0]s 顺序
如您所见,对于预先不知道 ndim 的一般情况,我无法以这种方式索引列表,因为它需要键入与 ndim 一样多的 [0]。
如果我有一个这样的数组而不是列表:
ndarray = np.array(ndlist)
访问 (0, 0, 0, ... ,0) 不会成为问题,因为我可以使用元组同时索引所有维度,如下所示:
% 3d 案例
索引 = (0,0,0)
ndarray[索引]
% 4d 案例
索引 = (0,0,0,0)
ndarray[索引]
% 案例
索引 = (0, 0, 0, ... ,0) % 我可以用代码生成这个
ndarray[索引] = 11
有没有办法用这样的单个元组索引列表? 更好的是,元组可以保存切片而不是索引吗? 例如数组也允许这样做:
ndarray[ 0:2 , 0, 0] = np.array([0, 0])
我的问题找到的唯一解决方案是使用递归一次索引一个维度。 有更好的解决方案吗? 谢谢!
现在我明白了这个问题。 如果您愿意拥有一个对您来说很容易的函数 donig。 否则,您需要创建自己的列表类型。
您将需要一个函数,它接受一个列表和n
(未知)个元素。 n
意味着您将需要*argv
该函数将获取列表并获取n
( argv
) 中的第i
个元素。
def get_element(the_list, *argv):
sub_list = the_list.copy()
for i in argv:
sub_list = sub_list[i]
return sub_list
注意:该函数复制原始list
以确保它没有被更改。
注意:您还需要处理index out of range
错误。 现在它会引发TypeError: 'blabla' object is not subscriptable
。
在这里,您将创建一个具有任何名称的类(让我们使用TypedList
),它继承自list
并覆盖__getitem__
方法。
class TypedList(list):
def __getitem__(self, keys):
sub_list = self.copy()
for i in keys:
sub_list = sub_list[i]
return sub_list
if __name__ == '__main__':
ndlist = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
lst = TypedList(ndlist)
print(lst[1, 1, 0, 2])
在这里,您还需要处理index out of range
错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.