从2D数组快速计算随机3D数组

2024-05-13 14:48:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个二维的整数数组,我们称之为“a”。在

我想创建一个包含所有1和0的三维数组“B”,以便:

  • 对于任何固定的(i,j)sum(B[i,j,:])==A[i.j],也就是说,B[i,j,:]中包含A[i,j]1s
  • 1被随机放置在第三维度。在

我知道如何使用标准的python索引来实现这一点,但结果证明这是非常缓慢的。在

我正在寻找一种方法来做到这一点,利用功能,可以使纽比快速。在

下面是使用标准索引的方法:

B=np.zeros((X,Y,Z))
indexoptions=range(Z)

for i in xrange(Y):
    for j in xrange(X):
        replacedindices=np.random.choice(indexoptions,size=A[i,j],replace=False)
        B[i,j,[replacedindices]]=1

有人能解释一下我怎样才能更快地做到这一点吗?在

编辑:这里有个例子“A”:

^{pr2}$

在这种情况下,X=Y=5,Z>;=5


Tags: 方法in功能证明利用for标准np
1条回答
网友
1楼 · 发布于 2024-05-13 14:48:32

基本上与@JohnZwinck和@DSM的想法相同,但是使用了一个shuffle函数来洗牌给定的轴:

import numpy as np

def shuffle(a, axis=-1):
    """
    Shuffle `a` in-place along the given axis.

    Apply numpy.random.shuffle to the given axis of `a`.
    Each one-dimensional slice is shuffled independently.
    """
    b = a.swapaxes(axis,-1)
    # Shuffle `b` in-place along the last axis.  `b` is a view of `a`,
    # so `a` is shuffled in place, too.
    shp = b.shape[:-1]
    for ndx in np.ndindex(shp):
        np.random.shuffle(b[ndx])
    return


def random_bits(a, n):
    b = (a[..., np.newaxis] > np.arange(n)).astype(int)
    shuffle(b)
    return b


if __name__ == "__main__":
    np.random.seed(12345)

    A = np.random.randint(0, 5, size=(3,4))
    Z = 6

    B = random_bits(A, Z)

    print "A:"
    print A
    print "B:"
    print B

输出:

^{pr2}$

相关问题 更多 >