【问题标题】:Convert a list of two numbers to indices for an array将两个数字的列表转换为数组的索引
【发布时间】:2022-01-05 03:26:08
【问题描述】:

短版:给定一个包含两个元素 [i, j] 的列表,我如何获得二维数组的 ij -元素而不是 i, j 行:arr[[i,j]]arr[i,j]

我见过使用*list 的类似案例,但我并不完全理解该运算符的工作原理。

更深层次的背景:

我有一个返回嵌套列表的函数,其中每个子列表是要在数组中使用的一对索引:


grid = np.full((3,3), 1)

def path():
   ...
   return [[i_1, j_1], [i_2, j_2], ...]

for i in path():
   grid[path()[i]] = 0

但由于path()[i] 是一个列表,grid[path()[i]] == 0 将两个 设置为零,而不是单个元素。如何防止这种情况发生?
虽然不是绝对必要的,但更快的解决方案会更好,因为此操作需要多次执行。

【问题讨论】:

    标签: python list indices


    【解决方案1】:

    让您感到困惑的是 Python/编程语言中数学符号和索引 2D(或 n 维)列表的差异。

    如果您有一个名为 X 的数学二维矩阵,并且假设您想要访问第一行和第一列中的元素,您可以编写 X( 1, 1).

    如果你有一个二维数组,它的元素就是列表。因此,如果您想访问名为 X 的数组的第一行,您可以这样做:

    X[0] # 0 because indexation starts at 0
    

    请记住,前面的语句返回一个新的列表。您也可以索引此列表。因为我们需要第一列,所以我们这样做:

    X[0][0] # element in 1st row and 1st column of matrix X
    

    因此答案是您需要连续索引矩阵,即应用链索引。

    至于你原来的问题,这是我的回答。假设 a 是包含索引 ij 的 2 元素列表,您要在 2D 数组中访问它们。我将二维数组表示为 b。然后你应用链式索引,第一个索引是 a 的第一个元素,第二个索引是 a 的第二个元素:

    a = [0, 0]  # list with 2 elements containing the indices
    b = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]  # 2D array in which you want to access b[0][0]
    i, j = a[0], a[1]
    print(b[i][j])
    

    显然你不需要使用变量i, j,我只是为了清楚起见:

    print(b[a[0]][a[1]])
    

    两个语句都打印出b的第一行第一列的元素:

    1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多