如何用数组(或任何其他支持加法以便它可以偏移的东西)干净地索引numpy数组[重复]

Posted

技术标签:

【中文标题】如何用数组(或任何其他支持加法以便它可以偏移的东西)干净地索引numpy数组[重复]【英文标题】:How to cleanly index numpy arrays with arrays (or anything else that supports addition so that it can be offset) [duplicate] 【发布时间】:2012-06-14 21:49:02 【问题描述】:

解释我的问题的最简单方法可能是举个例子,所以让我定义一些数组:

>>> 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))]
...

但两者都不是特别干净。

Monkey 将加法运算符修补到 slice 似乎不是一种选择,从 slice 继承以添加运算符似乎也不起作用;我收到错误消息,“类型‘切片’不是可接受的基本类型”。 (*Grumble* 这在 Ruby 中不会是问题 *Grumble*)

所以,我的问题是,使用可以存储和偏移的东西来访问(多于一维)子数组的最简洁方法是什么?

目前的选择:

test[Yinds+offset, :][:, Xinds+offset] 测试[yStart+offset:yEnd+offset, xStart+offset:xEnd+offset] test[slice(*(Yinds+offset)), slice(*(Xinds+offset))]

【问题讨论】:

【参考方案1】:

我不完全确定您想要什么,但也许 ix_ 会有所帮助?我想我见过比我在类似情况下更了解 numpy 的人。

>>> from numpy import array, arange, ix_
>>> a = arange(25).reshape(5,5)
>>> Xinds = array([1,2,3])
>>> Yinds = array([1,2,3])
>>> a
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]])
>>> a[ix_(Xinds, Yinds)]
array([[ 6,  7,  8],
       [11, 12, 13],
       [16, 17, 18]])
>>> a[ix_(Xinds+1, Yinds)]
array([[11, 12, 13],
       [16, 17, 18],
       [21, 22, 23]])
>>> Y2inds = array([1,3,4])
>>> a[ix_(Xinds, Y2inds)]
array([[ 6,  8,  9],
       [11, 13, 14],
       [16, 18, 19]])
>>> a[ix_(Xinds, Y2inds-1)]
array([[ 5,  7,  8],
       [10, 12, 13],
       [15, 17, 18]])

【讨论】:

这似乎是我正在寻找的。谢谢。

以上是关于如何用数组(或任何其他支持加法以便它可以偏移的东西)干净地索引numpy数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何用C ++制作迷宫中的可移动角色[关闭]

重复错误:“不再支持带有花括号的数组和字符串偏移量访问语法”与 phpmyadmin

如何用加法实现减法

如何用 Python 覆盖文件中间的一些字节?

如何用字符串填充数组?

如何用 Javascript 替换和追加