gpt4 book ai didi

python - 如何根据索引而不是值编写 numpy where 条件?

转载 作者:行者123 更新时间:2023-12-05 05:23:19 26 4
gpt4 key购买 nike

我有一个二维 numpy 数组,我需要提取所有元素 array[i][j]如果条件

x1range < i < x2rangey1range < j < y2range很满意。

这样的条件怎么写?我需要使用 mgrid/ogrid 吗?

编辑:应该写下我的附加要求。我找的是where条件,而不是拼接,因为我想把所有元素的值改成满足上述条件的(0,0,0)。我假设如果我有一个 where 条件,我就可以做到这一点。

Edit2:此外,是否有可能获得上述条件的“不”?

如,

if i > x1range and i < x2range and j > y1range and j < y2range: # the above condition
do nothing # keep original value
else:
val = (0,0,0)

最佳答案

问题 #1:获取范围内的索引

你可以使用 np.meshgrid获取这些索引 -

In [145]: x1range,x2range = 2,5
...: y1range,y2range = 1,4
...:

In [146]: np.meshgrid(np.arange(x1range,x2range),np.arange(y1range,y2range))
Out[146]:
[array([[2, 3, 4],
[2, 3, 4],
[2, 3, 4]]), array([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])]

问题 #2:提取或设置这些范围内的输入数组元素

你可以使用 np.ix_直接索引到输入数组 arr -

In [148]: arr
Out[148]:
array([[97, 69, 0, 60, 28, 97],
[98, 85, 24, 75, 97, 23],
[70, 25, 77, 86, 93, 66],
[ 0, 85, 51, 17, 40, 92],
[66, 28, 28, 22, 79, 52]])

In [149]: arr[np.ix_(np.arange(x1range,x2range),np.arange(y1range,y2range))]
Out[149]:
array([[25, 77, 86],
[85, 51, 17],
[28, 28, 22]])

有了这个索引,还可以直接设置所有这些元素。

问题 #3:提取或设置不在这些范围内的输入数组元素

要将满足的元素设置/提取为0s并保持其余不变,您可以使用NumPy broadcasting连同 boolean-indexing 就像这样 -

In [150]: Imask = np.in1d(np.arange(arr.shape[0]),np.arange(x1range,x2range))
...: Jmask = np.in1d(np.arange(arr.shape[1]),np.arange(y1range,y2range))
...: arr[~(Imask[:,None] & Jmask)] = 0
...:

In [151]: arr
Out[151]:
array([[ 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0],
[ 0, 25, 77, 86, 0, 0],
[ 0, 85, 51, 17, 0, 0],
[ 0, 28, 28, 22, 0, 0]])

关于python - 如何根据索引而不是值编写 numpy where 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38121584/

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