我在网上发现了这段代码,并且很难理解它的每个部分正在做什么因为我不精通python。
以下例程将数组作为输入,并返回一个字典,将每个唯一值映射到其索引
def partition(array):
return {i: (array == i).nonzero()[0] for i in np.unique(array)}
答案 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)}