我正在自动化从测试仪器导入和绘制数据(列为行,因此是2D数组)。导入后的数据具有一个基于每行第一列中的样本编号的索引,并且我希望根据该索引在其他列中选择数据。我在这里发现了一个类似的问题,Select certain rows (condition met), but only some columns in Python/Numpy并遵循这个例子来获得正确的子集。我不明白的是,为什么二维数组作为三维数组返回,一维长度为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],但是我正在试图理解为什么它以这种方式返回我的数据,就像我所理解的那样,我是否误解了代码应该是什么--这一次它只是个侥幸,但下一次它可能会失败吗?任何见解都将不胜感激。
发布于 2018-09-25 01:55:45
让我们把它分解成美味的碎片。
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]]])https://stackoverflow.com/questions/52488536
复制相似问题