【问题标题】:Funky behavior with numpy arraysnumpy 数组的古怪行为
【发布时间】:2013-06-07 23:53:58
【问题描述】:

希望有人可以向我解释我在 numpy 数组中观察到的以下行为:

>>> import numpy as np
>>> data_block=np.zeros((26,480,1000))
>>> indices=np.arange(1000)
>>> indices.shape
(1000,)
>>> data_block[0,:,:].shape
(480, 1000)            #fine and dandy
>>> data_block[0,:,indices].shape
(1000, 480)            #what happened????  why the transpose????
>>> ind_slice=np.arange(300)    # this is more what I really want.
>>> data_block[0,:,ind_slice].shape
(300, 480)     # transpose again!   arghhh!

我不理解这种转置行为,这对于我想做的事情非常不方便。谁能给我解释一下?获取data_block 子集的另一种方法将是一个很好的奖励。

【问题讨论】:

  • 实际的规则非常简单。如果花哨的索引(和标量在这方面也很花哨,这可能很奇怪但是......)都是连续的 numpy 可以猜出你想把花哨的索引产生的维度放在哪里。如果它们不连续,则将它们放在首位。如果您记得所有花哨的索引都“作为一个”工作,这是有道理的。

标签: python arrays numpy transpose indices


【解决方案1】:

您可以通过这种方式达到您想要的结果:

>>> data_block[0,:,:][:,ind_slice].shape
(480L, 300L)

我承认我不完全了解 numpy 索引的工作原理,但 the documentation 似乎暗示了您遇到的麻烦:

在切片元组中具有多个 non-: 条目的基本切片,就像使用单个 non-: 条目重复应用切片一样,其中 non-: 条目被连续获取(所有其他 non-: 条目被替换经过 :)。因此,x[ind1,...,ind2,:] 在基本切片下的行为类似于 x[ind1][...,ind2,:]

警告:以上不适用于高级切片。

和。 . .

在选择对象,OBJ是非元组序列对象,NDARRAY(数据类型整数或BOOL)或具有至少一个序列对象或NDARRAY(数据类型整数)的元组时触发高级索引布尔)。

因此,您通过使用 ind_slice 数组而不是常规切片进行索引来触发该行为。

文档本身说这种索引“可能有点令人难以置信的理解”,所以我们都遇到这个问题也就不足为奇了:-)。

【讨论】:

    【解决方案2】:

    一旦您了解了花哨的索引是如何工作的,就没什么好惊讶的了。如果您有列表或数组作为索引,它们必须都具有相同的形状,或者可以广播到一个共同的形状。该形状将是返回数组的基本形状。如果存在切片的索引,则基本形状数组中的每个条目都是多维的,因此基本形状会通过额外的条目进行扩展。虽然这似乎是一个奇怪的选择,但它确实是唯一符合多维花式索引的选择。例如,如果您执行以下操作,请尝试计算您期望的返回形状:

    >>> ind_slice=np.arange(16).reshape(4, 4)
    >>> data_block[ind_slice, :, ind_slice].shape
    (4, 4, 480) # No, (4, 4, 480, 4, 4) is not a better option
    

    有几种方法可以得到你所追求的。对于您问题中的特定情况,最明显的是不使用花哨的索引,因为您可以通过切片获得您所要求的内容:

    >>> data_block[0, :, :300].shape
    (480, 300)
    

    如果您确实需要花哨的索引,可以将切片替换为可广播的数组:

    >>> data_block[0, np.arange(480)[:, None], ind_slice].shape
    (480, 300)
    

    如果您需要用数组替换更复杂的切片,您可能需要查看np.ogridnp.mgrid

    【讨论】:

    • 感谢您勇敢地尝试解释它,Jaime。我仍然觉得它非常混乱。谢谢。
    猜你喜欢
    • 2011-10-28
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2015-08-16
    • 2020-01-14
    • 1970-01-01
    • 2013-09-02
    相关资源
    最近更新 更多