免责声明:初学者,自学Python用户。
ndarrays的一个非常酷的功能是它们能够接受整数元组作为索引(例如myNDArray[(1,2)] == myNDArray[1][2]
)。这允许我将索引未指定为变量(例如indicesTuple),直到脚本确定要使用的ndarray的哪个部分,在这种情况下,变量被指定为整数元组并用于访问ndarray的一部分(例如myNDArray[indicesTuple]
)。使用变量的效用是元组的LENGTH可以根据ndarray的尺寸而变化。
然而,这限制了我使用数值数组。我尝试使用列表,但它们不能将索引作为索引(例如myList[(1,2)]
给出错误。)。有没有办法为列表索引“解包”元组,因为可以用于函数参数?或者更简单或更有效的东西?
更新:神圣的,我忘记了存在。基本上我最终了解到你可以使用参数dtype = object初始化ndarray,它允许ndarray包含多种类型的Python对象,就像列表一样。至于访问列表,正如评论者指出的那样,我可以使用for循环迭代变量indicesTuple来访问列表中越来越嵌套的元素。对于就地编辑,请参阅接受的评论,真的在那里加倍努力。
答案 0 :(得分:0)
假设您有一个(i,j)
索引列表
indexList = [(1,1), (0,1), (1,2)]
您要从
索引的某些2D列表l = [[1,2,3],
[4,5,6],
[7,8,9]]
您可以使用列表推导来获取这些元素,如下所示
>>> [l[i][j] for i,j in indexList]
[5, 2, 6]
然后你的索引可以是你想要的任何东西。它们将在列表推导中解压缩,并用作列表索引。对于您的具体应用,我们必须查看您的索引变量的来源,但这是一般的想法。
答案 1 :(得分:0)
Python没有多维列表,所以myList[(1,2)]
只能被认为是(myList[1], myList[2])
的快捷方式(有时会很方便,尽管你可以使用import operator; x = operator.itemgetter(1,2)(myList)
来完成同样的事情。)
如果您的myList
看起来像
myList = [ ["foo", "bar", "baz"], ["a", "b", c" ] ]
然后myList[(1,2)]
无法工作(或有意义),因为myList
不是二维列表:它是包含对列表的引用的列表。您使用myList[1][2]
,因为第一个索引myList[1]
会返回对["a", "b", "c"]
的引用,您应用第二个索引[2]
来获取"c"
。
稍微相关,你可以使用字典来精确地模拟稀疏数组,方法是使用元组作为默认字典的键。
import collections
d = collections.defaultdict(str)
d[(1,2)] = "foo"
d[(4,5)] = "bar"
您尝试用作键的任何其他元组都将返回空字符串。它不是一个完美的模拟,因为您无法使用类似
之类的内容访问数组的完整行或列row1 = [d[1, x] for x in range(C)] # where C is the number of columns
col3 = [d[x, 3] for x in range(R)] # where R is the number of columns
答案 2 :(得分:0)
>>> width, height = 7, 6
>>> grid = dict(
((x,y),"x={} y={}".format(x,y))
for x in range(width)
for y in range(height))
>>> print grid[3,1]
x=3 y=1
>>> width, height = 7, 6
>>> grid = [
["x={} y={}".format(x,y) for x in range(width)]
for y in range(width)]
>>> print grid[1][3]
x=3 y=1
在这种情况下,你可以制作一个getter和setter函数:
def get_grid(grid, index):
x, y = index
return grid[y][x]
def set_grid(grid, index, value):
x, y = index
grid[y][x] = value
您可以更进一步,创建自己的类,其中包含列表列表,并定义一个索引器,它将元组作为索引并执行相同的过程。它可以做一些更明智的边界检查,并提供比字典更好的诊断,但它需要一些设置。我认为字典方法可以快速探索。
答案 3 :(得分:0)
我将您的问题解释为:
我有一个N维列表,以及一个包含N个值(T1,T2 ... TN)的元组。如何使用元组值访问列表?我不知道N会提前发生什么。
我不知道有这样做的内置方法,但你可以编写一个迭代挖掘列表的方法,直到达到最里面的值。
def get(seq, indices):
for index in indices:
seq = seq[index]
return seq
seq = [
[
["a","b"],
["c","d"]
],
[
["e","f"],
["g","h"]
]
]
indices = [0,1,0]
print get(seq, indices)
结果:
c
您也可以使用reduce
在*行中执行此操作,但读者不会非常清楚您要完成的操作。
print reduce(lambda s, idx: s[idx], indices, seq)
(*如果您使用3.X,则需要从reduce
导入functools
。所以,两行。)
如果要在N维列表中设置值,请使用get
访问列表的第二深级别,然后分配给该列表。
def set(seq, indices, value):
innermost_list = get(seq, indices[:-1])
innermost_list[indices[-1]] = value