【问题标题】:Preserving dimensions with variable NumPy slice使用可变 NumPy 切片保留维度
【发布时间】:2017-05-11 14:18:32
【问题描述】:

我有一个 3d NumPy 数组,我想从中获取许多切片。这些切片在第一维和第二维中将具有一个或多个长度,而第三维将完整返回。切片应始终为 3d。

我的尝试:

import numpy as np

a = np.zeros((1000, 10, 100))
row_sets = ([19, 20], [21])
col_sets = ([6], [7, 8])

for rows in row_sets:
    for cols in col_sets:
        b = a[[rows], [cols]]
        print(rows, cols, b.shape)

结果:

[19, 20] [6] (1, 2, 100)
[19, 20] [7, 8] (1, 2, 100)
[21] [6] (1, 1, 100)
[21] [7, 8] (1, 2, 100)

如果我从切片中删除嵌套括号:

b = a[rows, cols]

我在第二个维度上遇到了同样的问题,并且没有保留维度:

[19, 20] [6] (2, 100)
[19, 20] [7, 8] (2, 100)
[21] [6] (1, 100)
[21] [7, 8] (2, 100)

我正在寻找的结果是这样的:

[19, 20] [6] (2, 1, 100)
[19, 20] [7, 8] (2, 2, 100)
[21] [6] (1, 1, 100)
[21] [7, 8] (1, 2, 100)

【问题讨论】:

    标签: python arrays numpy slice


    【解决方案1】:

    您正在通过使用整数列表作为索引来触发advanced indexing,这会减少结果数组的维度,如果您还想对数组进行切片,您可以使用np.ix_ 来从整数列表重建切片索引:

    for rows in row_sets:
        for cols in col_sets:
            b = a[np.ix_(rows, cols)]
            print(rows, cols, b.shape)
    
    #[19, 20] [6] (2, 1, 100)
    #[19, 20] [7, 8] (2, 2, 100)
    #[21] [6] (1, 1, 100)
    #[21] [7, 8] (1, 2, 100)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 2021-11-23
      • 1970-01-01
      相关资源
      最近更新 更多