错误或意味着:numpy为重复的布尔索引引发“ValueError:太多布尔索引”

时间:2013-04-17 22:25:40

标签: python numpy multidimensional-array

我在实验宇宙学中做了一些模拟,并在使用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 <大概应该被视为另一个ndarray?

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

  

与索引数组一样,返回的是数据的副本,而不是数据的副本   用切片查看。

运行type(t[t < 8])也会提供ndarray,我猜应该拥有numpy数组的所有属性。我是否应该使用列表表达式做得更好?我还没有进行过时间比较,但我认为这对于大型2D阵列来说是一个问题。

2 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:1)

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

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

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

或者来自@mgilson:

t[np.logical_and(t < 8, t < 5)]