【问题标题】:Finding repeated rows in a numpy array在 numpy 数组中查找重复的行
【发布时间】:2016-10-20 14:52:37
【问题描述】:

以下函数旨在查找数组的唯一行:

def unique_rows(a):
    b = np.ascontiguousarray(a).view(np.dtype((np.void, a.dtype.itemsize * a.shape[1])))
    _, idx = np.unique(b, return_index=True)
    unique_a = a[idx]
    return unique_a

例如,

test = np.array([[1,0,1],[1,1,1],[1,0,1]])
unique_rows(test)
[[1,0,1],[1,1,1]]

我相信这个功能应该一直有效,但它可能不是无懈可击的。在我的代码中,我想计算一组粒子存在多少个唯一位置。粒子存储在一个二维数组中,每一行对应一个粒子的位置。这些位置的类型为 np.float64。 我还定义了以下函数

def pos_tag(pos):
    x,y,z = pos[:,0],pos[:,1],pos[:,2]
    return (2**x)*(3**y)*(5**z)

原则上,此函数应为任何 (x,y,z) 位置生成唯一值。

但是,当我使用这些函数来计算我的一组粒子中唯一位置的数量时,它们会产生不同的答案。这是由于第一个函数中可能存在一些逻辑缺陷,还是第二个函数没有为每个给定位置生成唯一值?

编辑:使用示例

我有一些长代码可以生成二维粒子位置数组。

partpos.shape = (6039539,3)

然后我按如下方式计算唯一行数

len(unqiue_rows(partpos))
6034411

posids = pos_tag(partpos)
len(np.unique(posids))
5328871

【问题讨论】:

  • 你的位置浮动吗?
  • 你能举一个你没有得到预期结果的例子吗?
  • 您能否详细解释一下您是如何使用第二个函数来确定唯一位置的数量的?
  • 对不起,不清楚,我实际上将partpos定义为粒子的位置,它有3列,而不是4列。
  • 请注意,链接的问题是在谈论整数,而不是浮点数。发生碰撞的概率仍然很低,但不等于零。

标签: python arrays function numpy


【解决方案1】:

我认为差异是由于精度错误引起的。 使用代码

print len(unique_rows(partpos.astype(np.float32)))
print len(np.unique(pos_tag(partpos)))

6034411
6034411

然而

print len(unique_rows(partpos.astype(np.float32)))
print len(np.unique(pos_tag(partpos.astype(np.float32))))

6034411
5328871

【讨论】:

    【解决方案2】:
    a = [[1,0,1],[1,1,1],[1,0,1]]
    
    # Convert rows to tuples so they're hashable, creating a generator thereof
    b = (tuple(row) for row in a)
    
    # Convert back to list of lists, after coercing to a set to eliminate non-unique rows
    unique_rows = list(list(row) for row in set(b))
    

    编辑:这很尴尬。我才意识到我并没有真正解决所提出的问题。这仍然可能是 OP 正在寻找的答案,所以我会留下它,但这并不是真正要问的。很抱歉。

    【讨论】:

    • 这种查找唯一行的方法是否独立于我在问题中描述的两种方法?如果是这样,它可能对测试有用。
    • 是的,这是一种更直接的 Pythonic 方式来完成同样的事情。唯一的主要问题是它不能确保每次运行时都具有相同的行顺序。您可以通过事后排序等方法强制执行订单。
    猜你喜欢
    • 2017-06-02
    • 2018-06-14
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多