首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用np.ix_来子集2D数组返回三维数组,其中最新的维数为1

使用np.ix_来子集2D数组返回三维数组,其中最新的维数为1
EN

Stack Overflow用户
提问于 2018-09-24 23:16:43
回答 1查看 525关注 0票数 1

我正在自动化从测试仪器导入和绘制数据(列为行,因此是2D数组)。导入后的数据具有一个基于每行第一列中的样本编号的索引,并且我希望根据该索引在其他列中选择数据。我在这里发现了一个类似的问题,Select certain rows (condition met), but only some columns in Python/Numpy并遵循这个例子来获得正确的子集。我不明白的是,为什么二维数组作为三维数组返回,一维长度为1。

最小工作实例:

代码语言:javascript
复制
>>> 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],但是我正在试图理解为什么它以这种方式返回我的数据,就像我所理解的那样,我是否误解了代码应该是什么--这一次它只是个侥幸,但下一次它可能会失败吗?任何见解都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-25 01:55:45

让我们把它分解成美味的碎片。

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

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

代码语言:javascript
复制
>>> 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)当花式索引和非花式索引混合使用时,它们是独立应用的:

代码语言:javascript
复制
>>> 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]]])

相比之下:

代码语言:javascript
复制
>>> aa[I, I]
array([  2, 104, 206, 308])

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

代码语言:javascript
复制
>>> 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]]])

对于索引机器中的一个不幸的或至少非常混乱的设计选择,如果元组是唯一的索引,则元组将被忽略:

代码语言:javascript
复制
>>> 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]]])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52488536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档