【问题标题】:Extracting specific columns from multi-dimensional array从多维数组中提取特定列
【发布时间】:2018-06-25 10:48:52
【问题描述】:

假设我们在 Python 中有一个形状为 (1, 22, 22) 的 3d numpy 数组 - 用于说明的随机维度。如果我想从 Y、Z 中提取前 2 个维度,那么我可以这样做:

new_array = array[:, 0:2, 0:2] 
new_array.shape
(1, 2, 2) 

但是当我尝试通过明确指定前两个维度来做同样的事情时,如:

new_array = array[:, [0,1], [0,1]] 
new_array.shape
(1, 2)

我得到了不同的结果。为什么?如何选择特定维度而不是维度范围?

【问题讨论】:

    标签: python arrays slice dimensions


    【解决方案1】:

    我阅读了文档并使用了我的代码。就我的问题而言,唯一似乎有效但无效的是:

    columns = np.array(([0, 1]), ([0,1]), dtype=np.intp)
    new_array = my_array[:, columns, 0]
    

    我仍然不太确定它为什么会起作用。

    编辑:没有按预期工作

    【讨论】:

      【解决方案2】:

      将列表传递给 numpy 数组的 __getite__ 使用高级索引而不是切片。请参阅文档here

      在选择对象,OBJ是非元组序列对象,NDARRAY(数据类型整数或BOOL)或具有至少一个序列对象或NDARRAY(数据类型整数)的元组时触发高级索引布尔)。高级索引有两种类型:整数和布尔值。

      在您的情况下,您使用的是整数数组索引。整数索引链作为一个单元被广播和迭代。所以使用

      array[:, [0,1], [0,1]] 
      

      选择元素(0,0)(1,1)不是维度 1 中的第零个和第一个子数组,而第 0 个和第一个子数组构成维度 2。

      【讨论】:

      • 感谢您的回答。我理解我的错误,但在阅读文档后我仍然不明白如何执行操作。
      • 基本上,当您传递多个维度的多个索引列表时,这些列表会ziped 一起,并提取这些位置的元素。
      • 我理解了这个问题,但是我发现文档中缺少示例,所以我不明白如何解决我的问题。我正在尝试使用 np._ix 但无法到达任何地方。
      • 您要解决的具体问题是什么?
      • 与我的问题中的上述示例类似。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多