当前位置: 首页 > 面试题库 >

在numpy中快速找到对称对

彭成天
2023-03-14
问题内容
from itertools import product
import pandas as pd

df = pd.DataFrame.from_records(product(range(10), range(10)))
df = df.sample(90)
df.columns = "c1 c2".split()
df = df.sort_values(df.columns.tolist()).reset_index(drop=True)
#     c1  c2
# 0    0   0
# 1    0   1
# 2    0   2
# 3    0   3
# 4    0   4
# ..  ..  ..
# 85   9   4
# 86   9   5
# 87   9   7
# 88   9   8
# 89   9   9
# 
# [90 rows x 2 columns]

如何快速查找,识别和删除此数据帧中所有对称对的最后一个重复项?

对称对的一个示例是“(0,1)”等于“(1,0)”。后者应删除。

算法必须快速,因此建议使用numpy。不允许转换为python对象。


问题答案:

您可以对值进行排序,然后groupby

a= np.sort(df.to_numpy(), axis=1)
df.groupby([a[:,0], a[:,1]], as_index=False, sort=False).first()

选项2 :如果您有很多双c1, c2groupby可能会很慢。在这种情况下,我们可以分配新值并按以下条件过滤drop_duplicates

a= np.sort(df.to_numpy(), axis=1)

(df.assign(one=a[:,0], two=a[:,1])   # one and two can be changed
   .drop_duplicates(['one','two'])   # taken from above
   .reindex(df.columns, axis=1)
)


 类似资料:
  • 问题内容: 我需要函数或函数。 有各种和功能,但我很惊讶地发现缺少的功能。 为了使事情正常,我一直在使用这种相当慢的替代方法 我的数组通常包含32,000个元素,因此这被证明是一个瓶颈。我很想尝试,和,但是我认为我应该在这里提出问题,因为可能会有更好的解决方案。 问题答案: 我有一个更快的机制,尽管您需要运行一些测试以查看准确性是否足够。 这是原始的exp / sum / log版本: 这是一个使

  • 问题内容: 我在多个循环中多次使用numpy的where函数,但是它变得太慢了。有什么方法可以更快地执行此功能?我读到您应该尝试内联进行循环,并在for循环之前为函数创建局部变量,但是似乎没有什么可以提高速度的。在和有的具有形状。我用得到的瓶颈在哪里手柄,并且where在for循环是一个大的。 问题答案: 事实证明,在这种情况下,纯Python循环比NumPy索引(或对np.where的调用)要快

  • 问题内容: 我知道我可以像下面这样: 但是,由于它做了完整的排序,所以它非常慢。 我想知道numpy是否提供一些可以快速完成的方法。 问题答案: 该模块具有一种快速的局部排序方法,可直接与Numpy数组配合使用:。 请注意,返回的是已排序的实际值,如果要使用已排序的值的索引(返回值),则应使用。 我已经进行了基准测试: 其中是一个随机的1,000,000个元素的数组。 时间安排如下: :每个循环2

  • 问题内容: 是否有内置的Numpy / Scipy函数来查找四分位数范围?我自己可以很容易地做到这一点,但是基本上存在… 问题答案: 接受多个百分位参数,这样做会稍微好一些: 要么 而不是两次致电:

  • 问题内容: 在应用程序的核心(用Python编写并使用NumPy编写)中,我需要旋转一个四阶张量。实际上,我需要多次旋转许多张量,这是我的瓶颈。我涉及八个嵌套循环的幼稚实现(如下)似乎很慢,但是我看不到利用NumPy矩阵运算并希望加快处理速度的方法。我有一种应该使用的感觉,但是我不知道如何使用。 数学上,旋转张量T’的元素由下式给出:T’ijkl = ∑ g ia g jb g kc g ld T

  • 问题内容: 使用正则表达式,最简单的方法是获取网站HTML并在此标记内找到值(或与此相关的任何属性值): 问题答案: 取决于您需要构建(验证等)Http请求的复杂程度。这是我过去使用过的一种简单方法。 编译时可能会发现很多错别字。 (希望这不是功课)