索引数组的唯一行

时间:2016-03-27 16:48:14

标签: python arrays numpy pandas

我想获取数组中唯一行的索引。唯一的行应该有自己的索引(从零开始)。这是一个例子:

import numpy as np

a = np.array([[ 0.,  1.],
              [ 0.,  2.],
              [ 0.,  3.],
              [ 0.,  1.],
              [ 0.,  2.],
              [ 0.,  3.],
              [ 0.,  1.],
              [ 0.,  2.],
              [ 0.,  3.],
              [ 1.,  1.],
              [ 1.,  2.],
              [ 1.,  3.],
              [ 1.,  1.],
              [ 1.,  2.],
              [ 1.,  3.],
              [ 1.,  1.],
              [ 1.,  2.],
              [ 1.,  3.]])

在上面的数组中有六个唯一的行:

import pandas as pd
b = pd.DataFrame(a).drop_duplicates().values

    array([[ 0.,  1.],   
           [ 0.,  2.],
           [ 0.,  3.],
           [ 1.,  1.],
           [ 1.,  2.],
           [ 1.,  3.]])

每行代表一个索引(0,1,2,3,4,5)。为了获得数组a中唯一行的索引,结果将是:

[0, 1, 2, 0, 1, 2, 0, 1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5]

如何以有效的方式获得此结果?

3 个答案:

答案 0 :(得分:3)

纯粹的numpy解决方案:

av = a.view(np.complex)
_,inv = np.unique(av,return_inverse=True)

然后inv是:

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

np.complex用于打包两个组件,保留顺序。对于其他类型,其他方法也是可能的。

答案 1 :(得分:0)

没有 numpy pandas 的解决方案:

a = [[0, 1],
     [0, 2],
     [0, 3],
     [0, 1],
     [0, 2],
     [0, 3],
     [0, 1],
     [0, 2],
     [0, 3],
     [1, 1],
     [1, 2],
     [1, 3],
     [1, 1],
     [1, 2],
     [1, 3],
     [1, 1],
     [1, 2],
     [1, 3]]

b = []

#= ALGORITHM

point = -1                                               # Increment
cache = [[-1 for x in range(1000)] for x in range(1000)] # Change to dynamic

for i in a:
    x = i[0]; y = i[1]

    # Check what's going on here...
    # print("x: {0} y: {1} --> {2} (cache)".format(x, y, cache[x][y]))

    if cache[x][y] == -1:
        point += 1
        cache[x][y] = point
        b.append(point)
    else:
        b.append(cache[x][y])

#= TESTING

print(b) # [0, 1, 2, 0, 1, 2, 0, 1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5]

答案 2 :(得分:0)

这就是我得到的:

b = pd.DataFrame(a).drop_duplicates()
indexed_rows = np.zeros(a.shape[0], dtype=int)
for index, i in enumerate(a):
    for unique_row, j in enumerate(b.values):
        if np.all(i==j):
            indexed_rows[index] = unique_row

返回的结果是:

array([0, 1, 2, 0, 1, 2, 0, 1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5])