获取NumPy中唯一值的索引

时间:2018-03-17 22:35:49

标签: python arrays numpy

我在网上发现了这段代码,并且很难理解它的每个部分正在做什么因为我不精通python。

  

以下例程将数组作为输入,并返回一个字典,将每个唯一值映射到其索引

def partition(array):
  return {i: (array == i).nonzero()[0] for i in np.unique(array)}

3 个答案:

答案 0 :(得分:4)

追踪每个部分,这应该说明一切。评论内联。

const add = (num1) => (
  (num2) => num1 + num2
)

console.log(
  add(1)(2)
)

总结;代码正在创建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])}

答案 1 :(得分:2)

  • array == i每当值等于i时返回一个布尔数组True,否则返回False。
  • nonzero()返回非零元素的索引(不是False)。 https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.nonzero.html
  • nonzero()[0]返回第一个索引,其中array [index] = i。
  • for i in np.unique(array)迭代数组的所有唯一值,换句话说,执行数组唯一值的逻辑foreach值。

答案 2 :(得分:2)

还要考虑以下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 - 支持所有方法和索引,就像常规的1D 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)}