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

pla*_*lan 7 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
>>> 
Run Code Online (Sandbox Code Playgroud)

我希望它能回归:

array([0, 1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

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

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

与索引数组一样,返回的是数据的副本,而不是切片所获得的视图.

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

mgi*_*son 7

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

result = t[t<8]
result[t<5]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 哈,似乎"太多布尔索引"并不是指您尝试使用布尔索引访问元素的次数,而是指布尔索引数组的长度. (2认同)