为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人8056858 2019-11-28 09:52:30
我正在使用numpy,并希望在不丢失维度信息的情况下对行进行索引。import numpy as npX = np.zeros((100,10))X.shape        # >> (100, 10)xslice = X[10,:]xslice.shape   # >> (10,)  在此示例中,xslice现在为1维,但我希望它为(1,10)。在R中,我将使用X [10,:,drop = F]。numpy中是否有类似的东西。我在文档中找不到它,也没有看到类似的问题。谢谢!
查看完整描述

3 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

这可能是最容易做到的x[None, 10, :]或等效的方法(但更具可读性)x[np.newaxis, 10, :]。


至于为什么不是默认值,我个人发现,不断拥有单例维数的数组会非常烦人。我猜想那些麻木的开发者也有同样的感觉。


而且,numpy可以很好地处理广播数组,因此通常没有理由保留切片所来自的数组的尺寸。如果您这样做了,那么类似:


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

b = np.zeros(100,10)

a[0,:,:] = b

要么行不通,要么实施起来更加困难。


(或者至少这是我对切片时删除维度信息背后的numpy开发人员的猜测)


查看完整回答
反对 回复 2019-11-28
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

另一个解决方案是


X[[10],:]

要么


I = array([10])

X[I,:]

当由索引列表(或数组)执行索引时,将保留数组的维数。这很好,因为它使您可以选择保留尺寸和压缩尺寸。


查看完整回答
反对 回复 2019-11-28
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

这是我更喜欢的替代方法。而不是使用单个数字编制索引,而是使用范围进行索引。即使用X[10:11,:]。(请注意,其中10:11不包括11)。


import numpy as np

X = 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)


查看完整回答
反对 回复 2019-11-28
  • 3 回答
  • 0 关注
  • 367 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信