解释我的问题最简单的方法可能是用一个例子,所以让我定义一些数组:
>>> test = arange(25).reshape((5,5))
>>> test
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
>>> Xinds = array([1,2,3])
>>> Yinds = array([1,2,3])
现在,如果我想要第1、2、3行和第0列中的元素,我可以:
>>> test[Yinds,0]
array([ 5, 10, 15])
如果我想要第1、2、3行和所有列中的项目,我可以:
>>> test[Yinds, :]
array([[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
但是,如果我试图扩展这个函数来获取第1、2、3行和第1、2、3列中的元素,那真是太意外了!--取而代之的是(1,1),(2,2)和(3,3)中的元素
>>> test[Yinds, Xinds]
array([ 6, 12, 18])
而不是我想要的:
>>> test[Yinds, :][:, Xinds]
array([[ 6, 7, 8],
[11, 12, 13],
[16, 17, 18]])
>>> test[1:4,1:4]
array([[ 6, 7, 8],
[11, 12, 13],
[16, 17, 18]])
我知道我可以定义一个切片,但是我想能够为索引添加一个偏移量(例如Yinds+offset),而这不能用切片来完成。
我可以做点什么
>>> xStart = 1
>>> xEnd = 4
>>> yStart = 1
>>> yEnd = 4
>>> offset = 1
>>> test[yStart+offset:yEnd+offset, xStart+offset:xEnd+offset]
...
或者
>>> Xinds = array([1,4])
>>> Yinds = array([1,4])
>>> offset = 1
>>> test[slice(*(Yinds+offset)), slice(*(Xinds+offset))]
...
但两者都不是特别干净的。
在切片中修补addition运算符似乎不是一个选项,从切片继承以添加运算符似乎也不起作用;我得到一个错误,“type'slice'不是可接受的基类型”。(*发牢骚*这在Ruby中不是问题*发牢骚*)
所以,我的问题是,用可以存储和偏移的东西访问(超过一维)子数组的最干净的方法是什么?
迄今为止的选择:
我不完全确定你想要什么,但也许^{} 会有帮助?我想我见过一些人比我在类似的场合更了解numpy。
相关问题 更多 >
编程相关推荐