首页 > 后端开发 > Python教程 > 如何高效查找 NumPy 数组中特定值的行索引?

如何高效查找 NumPy 数组中特定值的行索引?

Barbara Streisand
发布: 2024-12-07 17:22:13
原创
717 人浏览过

How to Efficiently Find Row Indices of Specific Values in a NumPy Array?

在 NumPy 数组中查找特定值的索引

问题:

给定一个数组 X,确定存储在 searched_values 中的指定值的行索引 例如,在下面的示例中,我们查找 的索引。数组 X 中的值 [4, 2]、[3, 3] 和 [5, 6]。

X = np.array([[4,  2],
              [9,  3],
              [8,  5],
              [3,  3],
              [5,  6]])

searched_values = np.array([[4, 2],
                            [3, 3],
                            [5, 6]])
登录后复制

所需的输出将是:

[0, 3, 4]
登录后复制

解决方案:

方法 1:NumPy广播

是利用np.where的一种方式,广播函数如下。

np.where((X == searched_values[:, None]).all(-1))[1]
登录后复制

方法2:内存高效的线性索引转换

如何使用NumPy的np.ravel_multi_index将每一行转换为唯一的线性索引。

dims = X.max(0) + 1
out = np.where(np.in1d(np.ravel_multi_index(X.T, dims),
                       np.ravel_multi_index(searched_values.T, dims)))[0]
登录后复制

方法 3:内存高效且优化的线性索引转换

NumPy 的 np.searchsorted 也可以用于快速查找线性索引。

dims = X.max(0) + 1
X1D = np.ravel_multi_index(X.T, dims)
searched_valuesID = np.ravel_multi_index(searched_values.T, dims)
sidx = X1D.argsort()
out = sidx[np.searchsorted(X1D, searched_valuesID, sorter=sidx)]
登录后复制

np.ravel_multi_index 的工作原理:

np.ravel_multi_index 创建多维索引的线性索引表示。将每一行解释为 n 维多维数组的索引并生成相应的线性索引。

例如,将 np.ravel_multi_index(X.T, dims) 应用于样本数组 X:

np.ravel_multi_index(X.T, dims)
# Output: array([30, 66, 61, 24, 41])
登录后复制

这表示数组 X 的每一行具有的线性索引。该线性索引可用于唯一标识数组中的每一行。

每个方法对应的示例代码如下。

# Approach 1
print(np.where((X == searched_values[:, None]).all(-1))[1])

# Approach 2
dims = X.max(0) + 1
print(np.where(np.in1d(np.ravel_multi_index(X.T, dims),
                       np.ravel_multi_index(searched_values.T, dims)))[0])

# Approach 3
dims = X.max(0) + 1
X1D = np.ravel_multi_index(X.T, dims)
searched_valuesID = np.ravel_multi_index(searched_values.T, dims)
sidx = X1D.argsort()
print(sidx[np.searchsorted(X1D, searched_valuesID, sorter=sidx)])
登录后复制

您可以使用任一方法轻松确定数组 X 中特定值的行索引。

以上是如何高效查找 NumPy 数组中特定值的行索引?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板