以简洁而可扩展的方式表达多个阵列元素元素的每种组合



我有三个一维阵列a, b, c的不同尺寸,我想计算每个组合x in a, y in b, z in c的链式不等式x < y < z。例如:

import numpy as np
a = np.random.randint(100, size=100)
b = np.random.randint(100, size=200)
c = np.random.randint(100, size=300)
expected = np.empty(shape=(a.size, b.size, c.size), dtype=bool)
for i, x in enumerate(a):
    for j, y in enumerate(b):
        for k, z in enumerate(c):
            expected[i, j, k] = x < y < z

上面的三个循环是说明期望结果应如何出现,但我当然想使用矢量化语句。为此,我想到了以下两个表达式:

result1 = (a[:, None] < b)[:, :, None] & (b[:, None] < c)[None, :, :]
result2 = (a[:, None, None] < b[:, None]) & (b[None, :, None] < c[None, :])

都涉及很多重塑和插入额外的尺寸,并且并不是很明显或表达的。我觉得应该有一种更简洁的方法来实现这一目标,我一直在研究np.ufunc.outer,但是我不知道如何将其用于该目的,因为执行&时,两个操作数应该共享轴。p> 将缩放到任意数量的数组:作为另一个问题,我想询问是否有一种简洁的方法将上述操作缩放到任意数量的一维数组,例如a < b < c < d < ... < g对于元素的每种组合,例如给定arrays的列表。

np.ix_在这里很方便:

A,B,C = np.ix_(a,b,c)
(A<B)&(B<C)

任意数量的数组:

l = [np.random.randint(10*i, size=i) for i in range(2,6)]
L = np.ix_(*l)
np.bitwise_and.reduce(list(map(np.less, L, L[1:])))

或使用functools(更快一些(

import functools as ft
ft.reduce(np.bitwise_and, map(np.less, L, L[1:]))

最新更新