是否有人知道如何在矩阵中逐行获取唯一元素?例如,输入矩阵可能如下所示:
a = [[1,2,1,3,4,1,3],
[5,5,3,1,5,1,2],
[1,2,3,4,5,6,7],
[9,3,8,2,9,8,4],
[4,6,7,4,2,3,5]]
它应返回以下内容:
b = rowWiseUnique(a)
=> b = [[1,2,3,4,0,0,0],
[5,3,1,2,0,0,0],
[1,2,3,4,5,6,7],
[9,3,8,2,4,0,0],
[4,6,7,2,3,5,0]]
在numpy中做这件事最有效的方法是什么?我试过下面的代码,有没有更好更短的方法来做这件事?
import numpy as np
def uniqueRowElements(row):
length = row.shape[0]
newRow = np.unique(row)
zerosNumb = length-newRow.shape[0]
zeros = np.zeros(zerosNumb)
nR = np.concatenate((newRow,zeros),axis=0)
return nR
b = map(uniqueRowElements,a)
b = np.asarray(b)
print b
5条答案
按热度按时间afdcj2ne1#
假设
a
中的值是浮点数,您可以用途:请注意,
using_complex
不会以与rowWiseUnique
相同的顺序返回唯一值;根据问题下方的注解,不需要对值进行排序。最有效的方法可能取决于数组中的行数。如果行数不是太大,使用
map
或for-loop
分别处理每行的方法是很好的,但是如果有很多行,可以使用numpy技巧通过调用np. unique来处理整个数组,从而做得更好。诀窍是给每一行添加一个唯一的虚数,这样,当你调用
np.unique
时,如果原始数组中的浮点数出现在不同的行中,它们将被识别为不同的值,但如果它们出现在同一行中,它们将被视为相同的值。下面,这个技巧是在函数
using_complex
中实现的。下面是一个基准测试,将原始方法rowWiseUnique
与using_complex
和solve
进行比较:第一个
fgw7neuy2#
最快的方法应该是使用sort和diff将所有重复项设置为零:
这大约是我电脑上unutbu解决方案的3倍:
为了返回每个唯一元素的计数,还可以执行以下操作:
`
svgewumm3#
您可以执行以下操作:
对于1000 X 1000阵列,这比OP的当前代码快大约4倍:
qhhrdooz4#
OP解决方案的一个变体,在使用
numpy.apply_along_axis
和大型(1000x1000)阵列时略有改进,大约提高了3%,但仍然比Ashwini的解决方案慢一点。使用行中有重复项的数组
a = np.random.random_integers(0, 500, (1000*1000)).reshape(1000,1000)
时,时序比似乎更接近。evrscar25#
这不是很有效率,因为将所有的零移到行的末尾不是很有效率。
输出量: