我正在自动从测试仪器导入和绘制数据(以列的行表示,因此是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幸,但又一次可能失败了?任何见解将不胜感激。
答案 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]]])