我正在寻找一个用0和1随机初始化的数值数组,我发现了下面的问题here,它描述了基本的随机数组以及如何控制维度.但是,我需要我的数组在嵌套轴的每个子数组上至少有一个‘1’.请参见示例:

import numpy as np    
size = (3, 5, 5)
proba_0 = 0.7
n_positions = np.random.choice([0,1], size=size, p=[proba_0, 1-proba_0])
print(n_positions)

[[[0 1 1 0 0]
  [0 0 0 0 0]
  [0 0 0 1 1]
  [1 0 0 0 0]
  [0 1 0 0 0]]

 [[0 1 1 1 1]
  [0 0 1 1 0]
  [1 0 0 1 1]
  [0 0 1 0 0]
  [0 1 0 1 1]]

 [[0 0 0 0 1]
  [0 0 1 0 1]
  [0 0 0 0 1]
  [0 0 0 1 0]
  [0 0 0 0 0]]]

这里的问题是,在该数组n_positions[0][1]中的以下位置处,数据仅用零填充.我需要在轴2上的每一行中至少有一个‘1’.我可以增加1发生的概率,但这并不能消除风险.

我可以通过循环或理解来实现这一点,使用一种方法,让NumPy生成1-5之间的随机数1,然后用0填充,但速度非常慢.我希望有一种更麻木、更友好的方法来实现这一点?

推荐答案

一个解决方案(以防您只想填充最后一个轴.如果要对所有轴执行此操作,则需要对所有轴重复此操作.)

def fillLastAxis(arr):
    # Position in all but last axes of rows that need a 1
    pos=~arr.any(axis=-1) # True on rows coords that miss a 1
    # Number of 1 to generate
    num=pos.sum()
    # Index (along the last axis, of the missing 1)
    idx=np.random.randint(0, arr.shape[-1], num)
    # Just add a one at this pos
    arr[pos, idx]=1

测试:

size = (3, 5, 5)
proba_0 = 0.7
n_positions = np.random.choice([0,1], size=size, p=[proba_0, 1-proba_0])
print("==== Before ====")
print(n_positions)
fillLastAxis(n_positions)
print("==== After ====")
print(n_positions)

展示会

==== Before ====
[[[1 0 1 1 1]
  [1 0 0 0 1]
  [0 1 0 0 0]
  [0 0 0 0 0]
  [1 0 1 0 1]]

 [[0 0 1 0 1]
  [0 0 0 0 0]
  [0 0 0 0 1]
  [0 1 1 0 1]
  [0 0 0 0 0]]

 [[0 0 0 0 1]
  [0 0 0 1 1]
  [1 1 1 0 1]
  [0 1 0 0 0]
  [0 1 0 0 1]]]
==== After ====
[[[1 0 1 1 1]
  [1 0 0 0 1]
  [0 1 0 0 0]
  [0 1 0 0 0]
  [1 0 1 0 1]]

 [[0 0 1 0 1]
  [0 0 1 0 0]
  [0 0 0 0 1]
  [0 1 1 0 1]
  [0 0 0 1 0]]

 [[0 0 0 0 1]
  [0 0 0 1 1]
  [1 1 1 0 1]
  [0 1 0 0 0]
  [0 1 0 0 1]]]

您可以看到,平面0的第3行和平面1的第1行之前缺少1.并在之后有一个(在位置1和2).

用更高的维度(用更多的轴进行测试,并减少这只是运气的可能性).这一次我强制种子,这样你就可以在家里测试,并判断结果,而不需要我打印整个数组,因为你有相同的.

size = (3, 6, 4, 5)
proba_0 = 0.5
np.random.seed(12)
n_positions = np.random.choice([0,1], size=size, p=[proba_0, 1-proba_0])
print("==== Before ====")
print(n_positions)
fillLastAxis(n_positions)
print("==== After ====")
print(n_positions)

如果我是正确的,那么结果中有3行全为0([0,2,1,:][2,0,3,:][2,4,3,:]).它们都填满了一个随机的1之后.

Python相关问答推荐

使用itertools出现第n个子串

删除pandas rame时间序列列中未更改的值

如何在超时的情况下同步运行Matplolib服务器端?该过程随机挂起

由于瓶颈,Python代码执行太慢-寻求性能优化

使用Ubuntu、Python和Weasyprint的Docker文件-venv的问题

Polars:使用列值引用when / then表达中的其他列

具有多个选项的计数_匹配

大Pandas 胚胎中产生组合

Pandas实际上如何对基于自定义的索引(integer和非integer)执行索引

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

从Windows Python脚本在WSL上运行Linux应用程序

基于行条件计算(pandas)

交替字符串位置的正则表达式

为什么我的sundaram筛这么低效

Discord.py -

Pandas—MultiIndex Resample—我不想丢失其他索引的信息´