使用np.ix_子集2D数组将返回3D数组,其中最新尺寸为1

时间:2018-09-24 23:16:44

标签: python arrays numpy indexing

我正在自动从测试仪器导入和绘制数据(以列的行表示,因此是2D数组)。导入后,我的数据在每行第一列中都有基于标本编号的索引,我想根据该索引在其他列中选择数据。我在Select certain rows (condition met), but only some columns in 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)

我知道获取2D数组所需要做的就是d[0],但是我试图理解为什么它会以这种方式返回我的数据,就像我误解了代码应该是什么一样-这次是a幸,但又一次可能失败了?任何见解将不胜感激。

1 个答案:

答案 0 :(得分:1)

让我们将其分解为可口的部分。

1)numpy中有两种基本的索引编制:幻想式和非幻想式。花式是使用数组和列表进行索引,非花式是使用切片和省略号,单数索引介于两者之间。

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]]])