我试图用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'
我将其发布在这里,因为我对自己的麻木技巧没有足够的信心来确保这是一个错误,并提交错误报告...
感谢您的帮助/反馈!
答案 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]]