7

我在实验宇宙学中做一些模拟,在使用 numpy 数组时遇到了这个问题。我是 numpy 的新手,所以我不确定我做错了还是错误。我跑:

Enthought Python Distribution -- www.enthought.com
Version: 7.3-1 (32-bit)

Python 2.7.3 |EPD 7.3-1 (32-bit)| (default, Apr 12 2012, 11:28:34) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "credits", "demo" or "enthought" for more information.
>>> import numpy as np
>>> t = np.arange(10)
>>> t[t < 8][t < 5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many boolean indices
>>> 

我希望它会返回:

array([0, 1, 2, 3, 4])

因为 t[t < 8] 大概应该被视为另一个ndarray?

numpy 文档(http://docs.scipy.org/doc/numpy/user/basics.indexing.html)说布尔数组作为索引:

与索引数组一样,返回的是数据的副本,而不是切片时的视图。

runningtype(t[t < 8])也给出了ndarray,我猜它应该具有 numpy 数组的所有属性。我应该用列表表达式做得更好吗?我还没有进行定时比较,但我想这对于大型二维数组来说是个问题。

4

2 回答 2

7

t[ t < 8 ]确实给你一个数组,但是,它没有给你一个与你开始时大小相同的数组。 t < 8将给出一个与 . 形状相同的布尔数组t。当您使用它来索引t时,您只提取布尔数组为True您留下较短数组的元素。当你再次这样做时:

result = t[t<8]
result[t<5]

然后布尔索引数组的形状t再次相同,但是您使用它来索引一个较小的数组,这就是导致错误的原因。

该文档是完全正确的。您的新数组不是view原始数组...它是数据的副本,但这并不意味着新数组的形状或大小与原始数组相同。

于 2013-04-17T22:38:54.870 回答
1

这是注定的。当您到达第二个布尔语句时,对“t”的引用已经毫无意义。在第一个语句中,您将 t 分段为小于 8 的值。在第二个语句中,您仍在分段“t”,但在一个临时数组上(称为“s”)。's' 上的索引请求不能始终正确映射到 't'。因此它抛出一个异常。

如果你想做多个布尔语句。将它们组合起来,使其显示为:

s = t[t < 8]
s[s < 5]

或者来自@mgilson:

t[np.logical_and(t < 8, t < 5)]
于 2013-04-17T22:39:20.520 回答