【问题标题】:select values in 3D array based on a 2D selection array (with indices values)基于 2D 选择数组(带有索引值)选择 3D 数组中的值
【发布时间】:2018-06-13 14:03:20
【问题描述】:

我有一个 2D 选择或掩码数组,形状 (375, 297) 在每个单元格中都有一个对应于索引整数的值,范围从 0 到 23。我想使用这个 2D 数组在 3D 数组(形状为 (24, 375, 297))中选择来自第一维的单元格(长度为 24 的单元格),以便输出形状为 (375,297) 的 2D 数组。我一直在尝试使用精美的索引和 xarray 包但没有成功。如何使用 python 3.6 做到这一点?

小例子:

2D 选择数组或掩码 (2,3),其值(3d 数组的索引)范围为 0 到 3 -

[[0,1,2],
 [3,1,0]] 

3D 数组 (4,2,3) 用之前的 2D 选择掩码过滤-

[[[25,27,30],
  [15,18,21]],
 [[13,19, 1],
  [5, 7, 10]],
 [[10, 1, 2],
  [5, 6, 18]],
 [[3, 13,18],
  [30,42,24]]]

应用 2D 选择掩码后的预期 2D (2,3) 数组输出 -

[[25,19, 2],
 [30, 7,21]]

【问题讨论】:

  • 你能写一个关于数组和期望输出的小例子吗?

标签: python arrays indexing mask


【解决方案1】:

编辑:忽略行上方。 从 2D 数组中获取所需数组的索引,然后从 3D 数组中单独获取该索引。

index3d = arr2d[i][j]
new_arr = arr3d[index3d]    # gives the 2D array at the 3D array's index 'index3d'

例子:

# shape of arr3d = 3,2,3
arr3d = [[[2,4,6],[8,10,12]],[[3,6,9],[12,15,18]],[[1,6,2],[5,3,4]]]
# shape of arr2d = 2,3, values 0-2
arr2d = [[0,1,0],[2,1,2]]
# select arr3d index from arr2d
index3d = arr2d[1][0]
# get 2D array from arr3d at index3d
new_arr = arr3d[index3d]
# prints:
# [[1, 6, 2], [5, 3, 4]]
print(new_arr)

编辑:

# shape of arr3d = 3,2,3
arr3d = [[[2,4,6],[8,10,12]],
         [[3,6,9],[12,15,18]],
         [[1,6,2],[5,3,4]]]
# shape of arr2d = 2,3, values 0-2
arr2d = [[0,1,0],
         [2,1,2]]
new_arr = [[],[]]
# append the values from the correct 2D array in arr3d
for row in range(len(arr2d)):
    for col in range(len(arr2d[row])):
        i = arr2d[row][col] # i selects the correct 2D array from arr3d
        new_arr[row].append(arr3d[i][row][col]) # get the same row/column from the new array
# prints:
# [[2, 6, 6], [5, 15, 4]]
print(new_arr)

【讨论】:

  • 对不起,但这不是解决方案。使用您的示例(将 arr2d 作为选择数组,将 arr3d 作为要过滤的输入数组),输出 new_arr 将是 [[2,6,6],[5,15,4]] - 如何获得此输出?
  • 哦,我明白了。您的意思是您正在尝试从同一位置的 3d 数组的值构建数组。我会在几分钟内更新它。
  • 我想通过使用 arr2d 作为掩码来输出 new_arr,并带有要在 arr3d 数组中选择的值的位置的索引...对不起,我不是英语。跨度>
  • 没问题,我已经编辑了我的答案。如果您需要,请告诉我
  • 非常感谢@17slim。稍后我将尝试使用原始数据。我试图避免 for 循环,因为它可能会变得非常慢,但至少你的脚本适用于这个小例子:-)。
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2018-08-26
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
相关资源
最近更新 更多