python花式索引_numpy的花式索引是如何实现的?

你有三个问题:

1。哪个__xx__方法重写/定义了numpy来处理花哨的索引?在

索引运算符[]可使用__getitem__、__setitem__和{}重写。编写一个简单的子类来提供一些内省是很有趣的:>>> class VerboseList(list):

... def __getitem__(self, key):

... print(key)

... return super().__getitem__(key)

...

我们先做一个空的:

^{pr2}$

现在用一些值填充它。请注意,我们尚未覆盖__setitem__,因此还没有任何有趣的事情发生:>>> l[:] = range(10)

现在我们来买一件东西。在索引0将是0:>>> l[0]

0

0

如果我们试图使用一个元组,我们会得到一个错误,但我们可以先看到元组!在>>> l[0, 4]

(0, 4)

Traceback (most recent call last):

File "", line 1, in

File "", line 4, in __getitem__

TypeError: list indices must be integers or slices, not tuple

我们还可以了解python如何在内部表示切片:>>> l[1:3]

slice(1, 3, None)

[1, 2]

有很多有趣的事情,你可以做这个对象给它一个尝试!在

2。为什么python列表本身就不支持奇特的索引呢?在

这很难回答。考虑它的一种方式是历史性的:因为numpy开发人员首先想到它。在

你们这些年轻人。我小时候…

在1991年第一次公开发行时,Python没有numpy库,要制作多维列表,必须嵌套列表结构。我假设早期的开发人员,尤其是Guido van Rossum(GvR)认为最初保持简单是最好的。切片索引已经相当强大了。在

然而,不久之后,人们对使用Python作为科学计算语言的兴趣与日俱增。从1995年到1997年,许多开发人员合作开发了一个名为numeric的库,numpy的早期前身。虽然他不是numeric或numpy的主要贡献者,但GvR与numeric开发人员协作,以使多维数组索引更容易的方式扩展Python的切片语法。后来,出现了numeric的替代方案,称为numarray;2006年,numpy被创造出来,融合了两者的最佳特性。在

这些库功能强大,但它们需要大量的c扩展等等。将它们放入基本Python发行版中会使它变得庞大。尽管GvR确实稍微增强了slice语法,但是在普通列表中添加花哨的索引将极大地改变它们的API,并且有点冗余。考虑到已经可以在外部库中使用花哨的索引,其好处不值得付出代价。在

老实说,这个故事的某些部分是推测性的。1我真的不了解开发人员!但我也会做出同样的决定。事实上。。。在

应该是那样的。

尽管花式索引功能非常强大,但我很高兴它在今天还不是普通Python的一部分,因为这意味着在处理普通列表时,您不必非常努力地思考。对于许多你不需要的任务,它所带来的认知负荷是很重要的。在

请记住,我指的是施加在读卡器和维护人员的负载。你可能是个天才,可以在你的脑子里做5-d张量积,但其他人必须读你的代码。在numpy中保持花哨的索引意味着人们除非真心需要它,否则不会使用它,这使得代码在总体上更具可读性和可维护性。在

3。为什么numpy在python2上的索引速度这么慢?是因为我在这个版本中没有对numpy的本地BLAS支持吗?在

可能吧。它完全取决于环境;我在我的机器上看不到相同的区别。在

1。故事中没有推测性的部分是从《科学与工程中的计算》(2011年第13卷)的一期特刊中讲述的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值