从数组中提取索引值
Posted
技术标签:
【中文标题】从数组中提取索引值【英文标题】:Extract the index value from array 【发布时间】:2022-01-23 18:10:33 【问题描述】:我有一个形状为 2x3 的数组 A1 和列表 A2。我想从列表中提取数组的索引值。
例子
A1 = [[0, 1, 2]
[3, 4, 5]] # Shape 2 rows & 3 columns
A2 = [0,1,2,3,4,5]
现在,我想编写一个代码来访问数组 A1 中元素的索引
预期输出
A2[3] = (1,0) #(1 = row & 0 = column) Index of No.3 in A1
请帮助我。谢谢
【问题讨论】:
A1
中的值是否相关?换句话说,您需要按值查找元素在哪里,还是只需要获取与某个位置对应的索引?这个例子是模棱两可的,因为两个数组都是相同np.arange(6)
的各种形状。
【参考方案1】:
这个问题有些模棱两可。我们是按值还是按顺序查找元素的索引?
解开序数索引
假设 A1
中的值不重要(即这不是搜索某些值,而是真正找到与某个位置对应的索引),你可以使用unravel_index
。
例子:
>>> np.unravel_index(3, A1.shape)
(1, 0)
或者,总的来说A2
一口气:
>>> np.unravel_index(A2, np.array(A1).shape)
(array([0, 0, 0, 1, 1, 1]), array([0, 1, 2, 0, 1, 2]))
您可能更喜欢将其作为元组列表(上述“转置”):
>>> list(zip(*np.unravel_index(A2, np.array(A1).shape)))
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]
搜索值
相反,如果您是搜索值,例如,A1
中是否有等于A2[i]
的值,那么,就像在@dc_Bita98 的回答中一样:
>>> tuple(np.argwhere(A1 == A2[3]).squeeze())
(1, 0)
如果您想在一张照片中拍摄所有位置,则需要采取措施来处理形状不同的事实。为了说明起见,还要说:
A3 = np.array([9, 1, 0, 1])
然后,要么:
>>> i, j, k = np.where(A1 == A3[:, None, None])
>>> out = np.full(A3.shape, (,), dtype=object)
>>> out[i] = list(zip(j, k))
>>> out.tolist()
[None, (1, 0), (2, 0), (3, 0)]
这清楚地表明第一个值 (9
) 没有找到,以及在哪里可以找到其他值。
或者:
>>> [tuple(np.argwhere(A1 == v).squeeze()) for v in A3]
[None, (0, 1), (0, 0), (0, 1)]
【讨论】:
嗨@Pierre D 感谢您的解决方案,我还有另一个问题。是否可以获得数组中存在的所有列表值的索引。??假设列表 A2 只有 0,1,3 个元素,那么它的输出应该为 (0,0), (0,1), (1,0)。 另外,当列表包含浮点元素时,unravel_index 会给出错误 ´''Iterator operand 0 dtype could not be cast from dtype('float64') to dtype('int64') 根据rule 'same_kind' ' 当 3 是 3.0 时如何解决这个错误?? 查看修改后的答案。此外,如果A2
包含浮点数,并且您想将它们用作索引,则应首先将它们转换为int
:A2.astype(int)
。我添加了您正在寻找 values 而不是位置的情况。
非常感谢@Pierre。是否可以使用“列表”一次性获取所有位置,您在修改后的答案中使用数组进行了解释。也可以通过list来完成吗?
是的,那将是我回答中的第三个代码 sn-p,这不是您要找的吗?【参考方案2】:
如果您可以使用 numpy,请查看argwhere
a1 = np.array([[0,1,2],[3,4,5]])
a2 = [0,1,2,3,4,5]
a3 = np.argwhere(a1 == a2[3]).squeeze() # -> (1, 0)
【讨论】:
以上是关于从数组中提取索引值的主要内容,如果未能解决你的问题,请参考以下文章