- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
考虑数组a
np.random.seed([3,1415])
a = np.random.randint(10, size=(5, 4))
a
array([[0, 2, 7, 3],
[8, 7, 0, 6],
[8, 6, 0, 2],
[0, 4, 9, 7],
[3, 2, 4, 3]])
我可以创建 b
,其中包含对每一列进行排序的排列。
b = a.argsort(0)
b
array([[0, 0, 1, 2],
[3, 4, 2, 0],
[4, 3, 4, 4],
[1, 2, 0, 1],
[2, 1, 3, 3]])
我可以用 b
对 a
进行排序
a[b, np.arange(a.shape[1])[None, :]]
array([[0, 2, 0, 2],
[0, 2, 0, 3],
[3, 4, 4, 3],
[8, 6, 7, 6],
[8, 7, 9, 7]])
这是说明我正在寻找的输出的入门读物。我想要一个数组 b
,它具有对 a
中的相应列进行排序所需的排列,同时还考虑使用另一个数组进行 lexsort
。
np.random.seed([3,1415])
a = np.random.randint(10, size=(10, 4))
g = np.random.choice(list('abc'), 10)
a
array([[0, 2, 7, 3],
[8, 7, 0, 6],
[8, 6, 0, 2],
[0, 4, 9, 7],
[3, 2, 4, 3],
[3, 6, 7, 7],
[4, 5, 3, 7],
[5, 9, 8, 7],
[6, 4, 7, 6],
[2, 6, 6, 5]])
g
array(['c', 'a', 'c', 'b', 'a', 'a', 'a', 'b', 'c', 'b'],
dtype='<U1')
我想生成一个数组 b
,其中每一列都是 lexsort
对应列 a
的必要排列。而 lexsort
是首先根据 g
定义的组对列进行排序,然后根据 a
中每一列的值进行排序。
我可以生成结果:
r = np.column_stack([np.lexsort([a[:, i], g]) for i in range(a.shape[1])])
r
array([[4, 4, 1, 4],
[5, 6, 6, 1],
[6, 5, 4, 5],
[1, 1, 5, 6],
[3, 3, 9, 9],
[9, 9, 7, 3],
[7, 7, 3, 7],
[0, 0, 2, 2],
[8, 8, 0, 0],
[2, 2, 8, 8]])
我们可以看到这是有效的
g[r]
array([['a', 'a', 'a', 'a'],
['a', 'a', 'a', 'a'],
['a', 'a', 'a', 'a'],
['a', 'a', 'a', 'a'],
['b', 'b', 'b', 'b'],
['b', 'b', 'b', 'b'],
['b', 'b', 'b', 'b'],
['c', 'c', 'c', 'c'],
['c', 'c', 'c', 'c'],
['c', 'c', 'c', 'c']],
dtype='<U1')
和
a[r, np.arange(a.shape[1])[None, :]]
array([[3, 2, 0, 3],
[3, 5, 3, 6],
[4, 6, 4, 7],
[8, 7, 7, 7],
[0, 4, 6, 5],
[2, 6, 8, 7],
[5, 9, 9, 7],
[0, 2, 0, 2],
[6, 4, 7, 3],
[8, 6, 7, 6]])
问题
有没有一种方法可以“广播”分组数组 g
的使用,以便在每一列 lexsort
中使用?执行此操作的更有效方法是什么?
最佳答案
这是一种方法-
def app1(a, g):
m,n = a.shape
g_idx = np.unique(g, return_inverse=1)[1]
N = g_idx.max()+1
g_idx2D = g_idx[:,None] + N*np.arange(n)
r_out = np.lexsort([a.ravel('F'), g_idx2D.ravel('F')]).reshape(-1,m).T
r_out -= m*np.arange(n)
return r_out
我们的想法很简单,我们创建一个 2D
网格 g
字符串数组的整数版本,然后用限制 的屏障偏移每一列lexsort
在每一列中搜索。
现在,在性能方面,对于大型数据集,lexsort
本身似乎是瓶颈。对于我们的问题,我们只处理两列。因此,我们可以创建自己的自定义 lexsort
,它根据偏移量缩放第二列,这是第一列的最大数字限制。相同的实现看起来像这样 -
def lexsort_twocols(A, B):
S = A.max() - A.min() + 1
return (B*S + A).argsort()
因此,将其合并到我们提出的方法中并优化 g_idx2D
的创建,我们将拥有像这样的正式函数 -
def proposed_app(a, g):
m,n = a.shape
g_idx = np.unique(g, return_inverse=1)[1]
N = g_idx.max()+1
g_idx2D = (g_idx + N*np.arange(n)[:,None]).ravel()
r_out = lexsort_twocols(a.ravel('F'), g_idx2D).reshape(-1,m).T
r_out -= m*np.arange(n)
return r_out
运行时测试
原始方法:
def org_app(a, g):
return np.column_stack([np.lexsort([a[:, i], g]) for i in range(a.shape[1])])
时间 -
In [763]: a = np.random.randint(10, size=(20, 10000))
...: g = np.random.choice(list('abcdefgh'), 20)
...:
In [764]: %timeit org_app(a,g)
10 loops, best of 3: 27.7 ms per loop
In [765]: %timeit app1(a,g)
10 loops, best of 3: 25.4 ms per loop
In [766]: %timeit proposed_app(a,g)
100 loops, best of 3: 5.93 ms per loop
关于python - 针对 lexsort : Permutation for sorting each column independently when considering yet another vector 的二维数组广播一维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44190644/
Numpy documentation在 np.random.permutation建议所有新代码使用 np.random.default_rng()来自随机生成器包。我在文档中看到,Random G
是否有任何已知的算法如何有效地生成具有附加限制的任何随机多集排列。 例子: 我有多个项目,例如:{1,1,1,2,2,3,3,3} ,以及一组限制性的集合,例如 { {3} , {1,2} , {1,
您将如何生成列表 b(1,6,8,3,9,5) 的所有可能排列包括不同长度的?例子: List a = [1,2,3] generateperms(a) 1,2,3 3,1,2 3,2,1 1,3,2
我不确定如何在限制范围内解决这个问题。 将“单词”视为大写字母 A-Z 的任何序列(不仅限于“字典单词”)。对于至少有两个不同字母的单词,还有其他单词由相同的字母组成但顺序不同(例如,STATIONA
题目地址:https://leetcode.com/problems/permutations/description/ 题目描述 Given a collection of distinct n
一行中有 n 个项目。我们必须在不能选择两个连续项目的限制下找到可以选择项目的方式数。 我试图用递归关系来做,但无法达到任何。请帮我解决问题。 最佳答案 在网上搜索后,我得到了上述问题的解决方案。 假
创建列表或集合的排列非常简单。我需要将函数应用于列表中所有元素的所有子集的每个元素,按照它们出现的顺序。例如: apply f [x,y] = { [x,y], [f x, y], [x, f y],
我遇到了一个看似简单的问题,有人可以帮忙吗? 我有两个列表 a和 b .我可以将列表的元素称为 a[i][j]其中 0
我正在将一个程序从 matlab 翻译成 Python。 matlab代码使用permute方法: B = PERMUTE(A,ORDER) rearranges the dimensions of
谜题 穷举一个数组中各个元素的排列 策略 减而治之、递归 JavaScript解 复制代码 代码如下:
题目地址:https://leetcode.com/problems/next-permutation/description/ 题目描述 Implement next permutation,
从我关于"Using SIMD AVX SSE for tree traversal" ive的另一个问题中,我得到了这个试图进行基准测试的代码。之前我没有对SIMD做任何事情,所以我对这种排列方式有
这段代码为我提供了长度为 x 的 n 值的所有可能组合,总和为 n。 function GETall_distri_pres($n_valeurs, $x_entrees, $combi_presen
如果我想找到列表的排列,我知道排列的数量由多项系数给出。例如,“MISSISSIPPI”有 11 个字母,“S”出现 4 次,“I”出现 4 次,“P”出现两次,“M”出现一次。因此“MISSISSI
我有一个伪代码,我已经将其翻译成java代码,但是每当我运行该代码时,我都会得到一个空的数组列表,但它应该给我一个随机的整数列表。这是伪代码: Algorithm 1. RandPerm(N) Inp
我想计算适合弗里德曼检验的分块设计的所有排列。考虑以下示例: thedata p dim(p) [1] 1295 12 R> head(p) [,1] [,2] [,3] [,4]
这与其说是编程问题,不如说是数学问题,但我认为这里的很多人都非常擅长数学! :) 我的问题是:给定一个 9 x 9 的网格(81 个单元格),其中必须包含数字 1 到 9,每个数字恰好出现 9 次,可
我有这个变量:message = "Hello World"我构建了一个对其进行洗牌的函数: def encrypt3(message,key): random.seed(key) l
以下程序使用 itertools.permutations 从列表中构造一个 URL。 def url_construct_function(): for i in range(1, len(
我有 36 个人和 6 张 table 。我想围绕每张 table 组成 6 个小组。然后再组成 6 个其他组,再组成 6 个其他组……直到每个人都遇到每个人,但没有人遇到两次。 到目前为止,我想出了
我是一名优秀的程序员,十分优秀!