带有numpy索引的错误(?)

时间:2018-09-04 15:11:37

标签: python numpy

我试图用numpy实现2D过滤器,但发现有些东西对我来说像个错误。

在下面的示例中,我尝试定位数据第一行,第二行和最后一行的第二列和第四列,即:

package main

import (
    "person"
)

var p person.Person = Person {
 FirstName : "Shiju",
 LastName : "Varghese",
 Dob : time.Date(1979, time.February, 17, 0, 0, 0, 0, time.UTC),
 Email : "shiju@email.com",
 Location : "Kochi",
}

func main(){
   p.PrintName()
   p.PrintDetails()   
}

我知道倒数第二行确实会返回该行,但是我无法在那里分配任何内容(它会返回一个副本)。但这仍然不能解释为什么最后一个失败。

[[ 2  4]
 [ 8 10]
 [26 28]] 

输出:

import numpy as np

# create my data: 5x6 array
data = np.arange(0,30).reshape(5,6)

# mask: only keep row 1,2,and 5
mask = np.array([1,1,0,0,1])
mask = mask.astype(bool)

# this is fine
print 'data\n', data, '\n'

# this is good
print 'mask\n', mask, '\n'

# this is nice
print 'data[mask]\n', data[mask], '\n'

# this is great
print 'data[mask, 2]\n', data[mask, 2], '\n'

# this is awesome
print 'data[mask][:,[2,4]]\n', data[mask][:,[2,4]], '\n'

# this fails ??
print 'data[mask, [2,4]]\n', data[mask, [2,4]], '\n'

我将其发布在这里,因为我对自己的麻木技巧没有足够的信心来确保这是一个错误,并提交错误报告...

感谢您的帮助/反馈!

1 个答案:

答案 0 :(得分:2)

这不是错误。

这是一个实现定义

如果您在高级索引部分阅读了array indexing,您会注意到它说

  

纯整数数组索引当索引包含尽可能多的索引时   整数数组,因为要索引的数组具有维,索引   是直截了当的,但与切片不同。高级索引   总是被广播并迭代为一个:

result[i_1, ..., i_M] == x[ind_1[i_1, ..., i_M], ind_2[i_1, ..., i_M],
                       ..., ind_N[i_1, ..., i_M]]

因此

print 'data[mask, [2,4]]\n', data[mask, [1,2,4]], '\n'

工作和输出

data[mask, [1,2,4]]
[ 1  8 28]

广播中的索引长度必须相同

也许您可以使用ix_函数来实现所需的功能。参见array indexing

columns = np.array([2, 4], dtype=np.intp)
print data[np.ix_(mask, columns)]

输出

[[ 2  4]
 [ 8 10]
 [26 28]]