python - 沿 numpy 数组的一个轴随机保留不为零的单个元素

标签 python numpy

我需要一种有效的方法来创建形状为 (x,y,3) 的 numpy 数组,其中每个元组 (x,y) 的 3 个随机元素中只有一个随机元素具有从 [-1,0 中随机选择的值,1]

 np.random.randint(-1, 2, (x,y,3))

仅满足我的要求的后半部分。

我可以使用嵌套循环来迭代每个 (x, y) 并将其值乘以随机掩码,但它根本效率不高。

这是循环实现:

a=np.random.randint(-1, 2, (x,y,3))
for i in range(a.shape[0]):
    for j in range(a.shape[1]):
        mask = np.array(np.random.permutation([0,1,0]))
        a[i][j] = a[i][j] * mask

最佳答案

我不会生成一大堆额外的数字并关闭其中的大部分,而是从只生成您需要的数字的角度来解决这个问题。您想要为每个 x-y 对分配一个介于 0 和 2 之间的随机索引。因此生成一个随机索引和随机值,并分配:

indices = np.random.randint(3, size=(x, y))
values = np.random.randint(-1, 2, size=(x, y))
result = np.zeros((x, y, 3), dtype=int)
result[(*np.ogrid[:x, :y], indices)] = values

索引表达式是 advanced index因为 indices 是一个整数列表。在这种情况下,对前两个索引使用 ...:, : 不会达到您想要的效果。相反,np.ogrid生成正确形状的范围,以强制indices 的元素对应于正确的 x-y 坐标。

关于python - 沿 numpy 数组的一个轴随机保留不为零的单个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57804903/

相关文章:

python - 线程即将终止怎么办?

python - 很难理解 Bellman Ford 的迭代

python - Numpy 使用较小的二维数组来映射具有更多元素的更大数组

algorithm - 在 numpy 的条件函数之前是否有一个保持值?

python - 在Python中读取npy数据文件并导出为文本文件

python - 计算算术运算

Python3 - 附加到不包含某些单词的数组行

python - 在 Elasticsearch 中逐字母搜索

python - Python 内置最大/最小函数的默认键

python - 有没有办法创建一个充满函数的 numpy 数组来代替元素?