numpy索引使用空ndarray的奇怪现象

4
当我进行numpy索引时,有时索引可能是一个空列表,在这种情况下我希望numpy也返回一个空数组。例如:
a = np.array([1, 2, 3])

b = []

print a[b]

这个运行得非常好!当结果给我:

result:[]

但是当我使用ndarray作为索引器时,奇怪的事情发生了:

a = np.array([1, 2, 3])

b = []

c = np.array(b)

print a[c]

这让我出现了一个错误:

IndexError: arrays used as indices must be of integer (or boolean) type

然而,当我这样做时:
a = np.array([1, 2, 3])

b = []

d = np.arange(0, a.size)[b]

print a[d]

然后它再次完美地工作:
result:[]

但是当我检查c和d的类型时,它们返回的是相同的类型!甚至形状等所有内容都一样:
print type(c), c.shape

print type(d), d.shape

result<type 'numpy.ndarray'> (0L,)

result<type 'numpy.ndarray'> (0L,)

我在想这段代码有什么问题吗?为什么 a[c] 不起作用,但是 a[d] 却可以?你能帮我解释一下吗?谢谢!

2个回答

3

在某种程度上,numpy数组有两种类型:它们自己的类型是numpy.ndarray,而元素的类型由numpy.dtype指定。用于索引的数组必须具有整数或布尔值dtype的元素。在你的例子中,你使用了两种不同默认dtypes的数组创建方法。工厂函数array默认为浮点dtype,如果没有从模板中推断出其他类型,则使用该类型。而arange使用整数dtype,除非你传递一些浮点参数。 由于dtype也是数组的属性,即使没有元素,也会指定和检查它。空列表不会检查dtype,因为它们没有dtype属性。


2

NumPy 不知道空数组的类型。

尝试:

c = np.array(b, dtype=int)

谢谢,这个可行!但我仍然认为这有点不方便。如果这是一个列表,我就不必担心它的类型问题,为什么我要告诉numpy一个空数组的类型呢? - Dirk Paul
在这种情况下,这可能对来说不方便,但并不一定对其他人如此。大多数人不需要像你一样创建空数组。更常见的创建空白/空数组的方法是np.zeros(n)。那也是dtype float。 - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接