gpt4 book ai didi

python - 如何用数组干净地索引 numpy 数组(或任何其他支持加法的东西,以便它可以被抵消)

转载 作者:太空狗 更新时间:2023-10-29 18:03:15 24 4
gpt4 key购买 nike

<分区>

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

>>> 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 继承以添加运算符似乎也不起作用;我收到错误消息,“类型‘slice’不是可接受的基类型”。 (*Grumble* 这在 Ruby 中不是问题 *Grumble*)

所以,我的问题是,访问(多于 1 维的)子数组的最干净的方法是什么可以存储和偏移?

到目前为止的选项:

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com