我想获取数组中唯一行的索引。唯一的行应该有自己的索引(从零开始)。这是一个例子:
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]
如何以有效的方式获得此结果?
答案 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])