首页 > 解决方案 > 使用 np.ix_ 子集 2D 数组返回 3D 数组,其中最新维度为 1

问题描述

我正在自动导入和绘制来自测试仪器的数据(以列的行,所以是二维数组)。我导入后的数据有一个基于每行第一列的标本号的索引,我想根据该索引选择其他列中的数据。我在这里找到了一个类似的问题选择某些行(条件满足),但只有 Python/Numpy 中的一些列,并按照该示例获取正确的子集。我不明白为什么 2D 数组作为 3D 数组返回,一维长度为 1。

最小的工作示例:

>>> c = np.array([[1,1,6,7],[1,2,9,8],[2,3,4,3],[3,4,6,2]])
>>> c
array([[1, 1, 6, 7],
       [1, 2, 9, 8],
       [2, 3, 4, 3],
       [3, 4, 6, 2]])
>>> np.shape(c)
(4, 4)

>>> d = c[np.ix_(c[:,0] == 1),2:4]
>>> d
array([[[6, 7],
        [9, 8]]])
>>> np.shape(d)
(1, 2, 2)

我知道获得二维数组所需要做的d[0]就是,但另一次它可能会失败?任何见解将不胜感激。

标签: pythonarraysnumpyindexing

解决方案


让我们把它分解成可口的部分。

1) 有两种基本类型的索引numpy:fancy 和 non-fancy。Fancy 是使用数组和列表进行索引,non-fancy 是使用切片和省略号,单个数字索引介于两者之间。

2)花式索引时,输出形状主要由索引数组确定,仅在较小程度上由索引数组确定:

>>> a = np.arange(2, 12, 2)
>>> a
array([ 2,  4,  6,  8, 10])
>>> I = np.arange(4)
>>> I
array([0, 1, 2, 3])
>>> a[I]
array([2, 4, 6, 8])
>>> I2 = I.reshape(2, 2)
>>> I2
array([[0, 1],
       [2, 3]])
>>> a[I2]
array([[2, 4],
       [6, 8]])

3)当花式和非花式索引混合时,它们是独立应用的:

>>> aa = np.add.outer(a, np.arange(0, 400, 100))
>>> aa
array([[  2, 102, 202, 302],
       [  4, 104, 204, 304],
       [  6, 106, 206, 306],
       [  8, 108, 208, 308],
       [ 10, 110, 210, 310]])
>>> aa[I, 2:4]
array([[202, 302],
       [204, 304],
       [206, 306],
       [208, 308]])
>>> aa[I2, 2:4]
array([[[202, 302],
        [204, 304]],

       [[206, 306],
        [208, 308]]])

相比之下:

>>> aa[I, I]
array([  2, 104, 206, 308])

4)np.ix_返回一个元组。这被解释为单一维度:

>>> np.ix_(I)
(array([0, 1, 2, 3]),)
>>> aa[np.ix_(I), 2:4]
array([[[202, 302],
        [204, 304],
        [206, 306],
        [208, 308]]])
>>> aa[I[None], 2:4]
array([[[202, 302],
        [204, 304],
        [206, 306],
        [208, 308]]])

由于索引机制中的一个不幸或至少非常令人困惑的设计选择,如果元组是唯一的索引,它将被忽略:

>>> aa[np.ix_(I)]
array([[  2, 102, 202, 302],
       [  4, 104, 204, 304],
       [  6, 106, 206, 306],
       [  8, 108, 208, 308]])
>>> aa[I[None]]
array([[[  2, 102, 202, 302],
        [  4, 104, 204, 304],
        [  6, 106, 206, 306],
        [  8, 108, 208, 308]]])

推荐阅读