我在实验宇宙学中做了一些模拟,并在使用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阵列来说是一个问题。
答案 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)]