[英]Explanation for the code that returns indices of unique values in 1D NumPy array
我在网上找到了这段代码,但由于我不精通 Python,所以很难理解它的每一部分在做什么。
以下例程将数组作为输入并返回将每个唯一值映射到其索引的字典
def partition(array):
return {i: (array == i).nonzero()[0] for i in np.unique(array)}
追踪每个部分,这应该不言自明。 评论内联。
In [304]: array = np.array([1, 1, 2, 3, 2, 1, 2, 3])
In [305]: np.unique(array) # unique values in `array`
Out[305]: array([1, 2, 3])
In [306]: array == 1 # retrieve a boolean mask where elements are equal to 1
Out[306]: array([ True, True, False, False, False, True, False, False])
In [307]: (array == 1).nonzero()[0] # get the `True` indices for the operation above
Out[307]: array([0, 1, 5])
总之; 代码正在创建<unique_value: all indices of unique_value in array>
映射 -
In [308]: {i: (array == i).nonzero()[0] for i in np.unique(array)}
Out[308]: {1: array([0, 1, 5]), 2: array([2, 4, 6]), 3: array([3, 7])}
这是更具可读性的版本 -
In [313]: mapping = {}
...: for i in np.unique(array):
...: mapping[i] = np.where(array == i)[0]
...:
In [314]: mapping
Out[314]: {1: array([0, 1, 5]), 2: array([2, 4, 6]), 3: array([3, 7])}
array == i
只要值等于 i 就返回一个布尔数组 True ,否则返回 False 。nonzero()
返回非零(非假)元素的索引。 https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.nonzero.htmlnonzero()[0]
返回第一个索引,其中 array[index] = i。for i in np.unique(array)
迭代数组的所有唯一值,或者换句话说,对数组的唯一值的每个值执行逻辑。还要考虑以下 Pandas 解决方案:
import pandas as pd
In [165]: s = pd.Series(array)
In [166]: d = s.groupby(s).groups
In [167]: d
Out[167]:
{1: Int64Index([0, 1, 5], dtype='int64'),
2: Int64Index([2, 4, 6], dtype='int64'),
3: Int64Index([3, 7], dtype='int64')}
PS pandas.Int64Index
- 支持所有方法和像常规一维 numpy 数组一样的索引
它可以很容易地转换为 Numpy 数组:
In [168]: {k:v.values for k,v in s.groupby(s).groups.items()}
Out[168]:
{1: array([0, 1, 5], dtype=int64),
2: array([2, 4, 6], dtype=int64),
3: array([3, 7], dtype=int64)}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.