gpt4 book ai didi

python - numpy.unravel_index 不返回预期的行索引

转载 作者:太空宇宙 更新时间:2023-11-03 17:50:03 25 4
gpt4 key购买 nike

我在理解 unravel_index 的输出时遇到了一些困难在以下代码的上下文中。

使用meshgrid我创建两个代表某些坐标的数组:

import numpy as np

x_in=np.arange(-800, 0, 70)
y_in=np.arange(-3500, -2000, 70)
y, x =np.meshgrid(y_in,x_in,indexing='ij')

然后,我遍历其中一个网格来识别特定限制内的值:

limit=100
x_gd=x[np.logical_and(x>=-600-limit,x<=-600+limit)]

这会返回一个包含我感兴趣的值的数组 - 为了获取这些值的索引,我使用以下函数(我在阅读 this 后开发的):

def get_index(array, select_array):
'''
Find the index positions of values from select_array in array
'''
rows,cols=array.shape
flt = array.flatten()
sorted = np.argsort(flt)
pos = np.searchsorted(flt[sorted], select_array)
indices = sorted[pos]
y_indx, x_indx = np.unravel_index(indices, [rows, cols])

return y_indx, x_indx

xx_y_indx, xx_x_indx = get_index(x, x_gd)

xx_x_indx 返回我所期望的 - 来自 x 的值的 col 引用:

array([2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3,
4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2,
3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4], dtype=int64)

xx_y_indx 然而返回:

array([15,  2, 19, 15,  2, 19, 15,  2, 19, 15,  2, 19, 15,  2, 19, 15,  2,
19, 15, 2, 19, 15, 2, 19, 15, 2, 19, 15, 2, 19, 15, 2, 19, 15,
2, 19, 15, 2, 19, 15, 2, 19, 15, 2, 19, 15, 2, 19, 15, 2, 19,
15, 2, 19, 15, 2, 19, 15, 2, 19, 15, 2, 19, 15, 2, 19], dtype=int64)

当我希望它显示所有行时,因为数组 x 表示的坐标每行都相同 - 不仅仅是第 15、2 和 19 行。

对于我感兴趣的内容,我可以只使用 xx_x_indx 的结果 - 列索引。但是,我无法解释为什么 y(行)索引会这样报告。

最佳答案

searchsorted 的调用未找到 flt[sorted]selected_array 出现的每个位置;它正在查找第一次出现的索引。

pos = np.searchsorted(flt[sorted], select_array)
<小时/>
In [273]: pos
Out[273]:
array([44, 66, 88, 44, 66, 88, 44, 66, 88, 44, 66, 88, 44, 66, 88, 44, 66,
88, 44, 66, 88, 44, 66, 88, 44, 66, 88, 44, 66, 88, 44, 66, 88, 44,
66, 88, 44, 66, 88, 44, 66, 88, 44, 66, 88, 44, 66, 88, 44, 66, 88,
44, 66, 88, 44, 66, 88, 44, 66, 88, 44, 66, 88, 44, 66, 88])

注意 pos 中所有重复的值。

<小时/>

超过这一点的所有内容可能都不是您想要的,因为您并没有真正处理 flt[sorted]select_array 值的所有位置>数组

<小时/>

您可以使用以下方法解决问题:

def get_index(array, select_array):
'''
Find the index positions of values from select_array in array
'''
mask = np.logical_or.reduce([array==val for val in np.unique(select_array)])
y_indx, x_indx = np.where(mask)
return y_indx, x_indx

def get_index2(array, select_array):
idx = np.in1d(array.ravel(), select_array.ravel())
y_indx, x_indx = np.where(idx.reshape(array.shape))
return y_indx, x_indx

哪个更快取决于np.unique(select_array)中的元素数量。当这个值很大时,使用 for-loop 会更慢,因此 get_index2 会更快。但是,如果 select_array 中有很多重复并且 np.unique(select_array) 很小,那么 get_index 可能是更快的选择。

<小时/>

要演示 np.unravel_index 的使用,您甚至可以使用

def get_index3(array, select_array):
idx = np.in1d(array.ravel(), select_array.ravel())
y_indx, x_indx = np.unravel_index(np.where(idx), array.shape)
return y_indx, x_indx

但我认为在所有情况下这都比 get_index2 慢,因为 reshape 非常快,因此将 np.wherereshape 一起使用 比使用 np.wherenp.unravel_index 更快。​​

关于python - numpy.unravel_index 不返回预期的行索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29238782/

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