Python Bug或其本意是:numpy加薪”;ValueError:布尔索引太多“;对于重复布尔索引

Python Bug或其本意是:numpy加薪”;ValueError:布尔索引太多“;对于重复布尔索引,python,numpy,multidimensional-array,Python,Numpy,Multidimensional Array,我在实验宇宙学中做一些模拟,在使用numpy阵列时遇到了这个问题。我是numpy的新手,所以我不确定我是做错了还是这是一个bug。我运行: 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)]

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

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
>>> 
既然t[t<8]应该被看作是另一个标准

numpy文档()将布尔数组作为索引:

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


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

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

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

result=t[t这意味着。当您到达第二个布尔语句时,对“t”的引用是毫无意义的。在第一个语句中,您将t分割为小于8的值。在第二个语句中,您仍然分割“t”,但在一个临时数组中(称之为“s”)。无法始终将“s”上的索引请求正确映射到“t”。因此,它会引发异常

如果要执行多个布尔语句,请将它们组合起来,使其显示:

s = t[t < 8]
s[s < 5]
s=t[t<8]
s[s<5]
或者从@mgilson:

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

您希望
t[t<8][t<5]返回什么?抱歉,为了更清楚起见,编辑了我的问题。@plan--您是否理解“复制”和“视图”在numpy数组方面的区别?术语“复制”可能会误导您。a
视图与父级共享内存。
a=np.arange(10);b=a[5:];b[0]=42;打印a
b
a
中的一个视图,即使它们有不同的形状。(即,变异
b
也会变异
a
)。如果我们执行类似的操作,给出“复制”而不是“视图”这意味着我们有一个单独的数组,它不与第一个数组共享内存。不确定,但我认为我现在做得更好。视图仍然是原始数据,这允许我执行,例如,
t[0:5][3:5]
。这与我最初对副本/视图的想法完全相反。感谢您的观察@mgilson。您不能像那样使用
运算符。您可以使用
np.logical\u和(tAh,这是有道理的!谢谢,我应该想到这一点。我的问题得到了回答。我已经使用了你建议的方法。是的,我在发布后立即尝试了它,并立即更改了它!这回答了我的问题,有道理。哈,似乎“布尔索引太多了”不是指您尝试使用布尔索引访问元素的次数,而是指布尔索引数组的长度。@askewchan--没错。我甚至没有想过以不同的方式解释回溯……可能是因为我熟悉numpy。现在我看到了混乱。是的,对我来说,这是一个非常混乱的回溯,是吗这在某种程度上是有意义的,还是令人困惑?@plan——对我来说是有意义的。它是说你的数组(
t<5
)是一个包含太多“布尔索引”的数组,无法索引另一个数组(
t[t])
t[np.logical_and(t < 8, t < 5)]