猿问

脾气暴躁的索引切片而不会丢失尺寸信息

我正在使用numpy,并希望在不丢失维度信息的情况下对行进行索引。


import numpy as np

X = np.zeros((100,10))

X.shape        # >> (100, 10)

xslice = X[10,:]

xslice.shape   # >> (10,)  

在此示例中,xslice现在为1维,但我希望它为(1,10)。在R中,我将使用X [10,:,drop = F]。numpy中是否有类似的东西。我在文档中找不到它,也没有看到类似的问题。


谢谢!


慕码人8056858
浏览 368回答 3
3回答

至尊宝的传说

这可能是最容易做到的x[None, 10, :]或等效的方法(但更具可读性)x[np.newaxis, 10, :]。至于为什么不是默认值,我个人发现,不断拥有单例维数的数组会非常烦人。我猜想那些麻木的开发者也有同样的感觉。而且,numpy可以很好地处理广播数组,因此通常没有理由保留切片所来自的数组的尺寸。如果您这样做了,那么类似:a = np.zeros((100,100,10))b = np.zeros(100,10)a[0,:,:] = b要么行不通,要么实施起来更加困难。(或者至少这是我对切片时删除维度信息背后的numpy开发人员的猜测)

潇潇雨雨

另一个解决方案是X[[10],:]要么I = array([10])X[I,:]当由索引列表(或数组)执行索引时,将保留数组的维数。这很好,因为它使您可以选择保留尺寸和压缩尺寸。

收到一只叮咚

这是我更喜欢的替代方法。而不是使用单个数字编制索引,而是使用范围进行索引。即使用X[10:11,:]。(请注意,其中10:11不包括11)。import numpy as npX = np.zeros((100,10))X.shape        # >> (100, 10)xslice = X[10:11,:]xslice.shape   # >> (1,10)这也使得使用更多尺寸也很容易理解,而无需None费力地弄清楚要使用哪个索引的轴。同样,无需为阵列大小做额外的记账工作,只需i:i+1为i您将在常规索引中使用的任何记账工作做好。b = np.ones((2, 3, 4))b.shape # >> (2, 3, 4)b[1:2,:,:].shape  # >> (1, 3, 4)b[:, 2:3, :].shape .  # >> (2, 1, 4)
随时随地看视频慕课网APP

相关分类

Python
我要回答