Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:检查数组的列是否在边界内,如果不在边界内,则选择一个随机数_Python_Arrays_Numpy_Array Broadcasting - Fatal编程技术网

Python:检查数组的列是否在边界内,如果不在边界内,则选择一个随机数

Python:检查数组的列是否在边界内,如果不在边界内,则选择一个随机数,python,arrays,numpy,array-broadcasting,Python,Arrays,Numpy,Array Broadcasting,我有一个表单数组 a = np.array([[1,2],[3,4],[5,6]]) 我有一个域或边界,这也是一个数组的形式 b = np.array([[0, 4], [3,7]]) 基本上我想检查a[:,0]是否在b的第一行内,a[:,1]是否在b的第二行内。例如,在这个例子中,a[:,0]=[1,3,5],我们可以看到它们都可以工作,除了大于4的5。类似地,a[:,1]=[2,4,6],我们看到2失败了,因为2方法1:这里有一种方法- # Invalid mask where new

我有一个表单数组

a = np.array([[1,2],[3,4],[5,6]])
我有一个域或边界,这也是一个数组的形式

b = np.array([[0, 4], [3,7]])
基本上我想检查a[:,0]是否在b的第一行内,a[:,1]是否在b的第二行内。例如,在这个例子中,a[:,0]=[1,3,5],我们可以看到它们都可以工作,除了大于4的5。类似地,a[:,1]=[2,4,6],我们看到2失败了,因为2方法1:这里有一种方法-

# Invalid mask where new values are to be put
mask = (a < b[:,0]) | (a > b[:,1])

# Number of invalid ones per column of a
count = mask.sum(0)

# Get lengths for range limits set by b
lens = b[:,1] - b[:,0]

# Scale for uniform random number generation
scale = np.repeat(lens, count)

# Generate random numbers in [0,1)
rand_num = np.random.rand(count.sum())

# Get offset for each set of random numbers. Scale and add offsets to get
#equivalent of all the original code uniform rand number generation
offset = np.repeat(b[:,0], count)
put_num = rand_num*scale + offset

# Finally make a copy as a float array and assign using invalid mask
out = a.copy().astype(float)
out.T[mask.T] = put_num
方法2:另一种方法是生成与a形状相同的缩放和偏移随机数,并简单地使用np.where和无效掩码在生成的随机数和a之间进行选择。实现会更简单,就像这样-

rand_nums = np.random.rand(*a.shape)*(b[:,1] - b[:,0]) + b[:,0]
mask = (a < b[:,0]) | (a > b[:,1])
out = np.where(mask, rand_nums, a)

这会给你你所需要的:

a总是按cols排序吗?另外,预期的o/p是:[[1,3],[3,4],[4,6]]吗?不是,应该是随机的o/p是什么?输出?是的,我指的是给定样本的预期输出。不,我不想使用np.clip,它必须是随机的!但是在边界之内谢谢你的回答!你会说这比我的方法快吗?@Euler_Salter让我问你-你在一个表中只有两列吗?是的,我只有两列,但可能有很多行,肯定超过5行,但可以是任何数字,50等等星号*在你的第二种方法中起什么作用?@Euler_Salter嗯,我想说试试这两种方法,自己看看。该星号用于向rand函数输入逗号分隔的输入
In [1004]: a
Out[1004]: 
array([[1, 2],
       [7, 4],
       [5, 6]])

In [1005]: b
Out[1005]: 
array([[ 2,  6],
       [ 5, 12]])

In [1006]: out
Out[1006]: 
array([[ 2.9488404 ,  8.97938277],
       [ 4.51508777,  5.69467752],
       [ 5.        ,  6.        ]])
# limits:  [2, 6]       [5, 12]
rand_nums = np.random.rand(*a.shape)*(b[:,1] - b[:,0]) + b[:,0]
mask = (a < b[:,0]) | (a > b[:,1])
out = np.where(mask, rand_nums, a)
import numpy as np
a = np.array([[1,2],[3,4],[5,6]])
b = np.array([[0,4], [3,7]])
for iter in range(np.size(a,1)):
    index = np.where(np.logical_or(a[:,iter]<b[0,iter], a[:,iter]>b[1,iter]))
    if len(index)!=0:
        a[index,iter] = np.random.random_integers(b[0,iter], b[1,iter], size=[len(index),1])