Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.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/5/fortran/2.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 使用带索引的np.where_Python_Performance_Numpy - Fatal编程技术网

Python 使用带索引的np.where

Python 使用带索引的np.where,python,performance,numpy,Python,Performance,Numpy,我有一个零数组(17520,5),我想用两个值填充:0和0.05。我有两个条件,我使用的是函数np。然而,我只需要在数组的特定索引处应用第二个条件。我使用的代码如下: independent = np.zeros([17520,5]) w1 = np.where(independent == 0) independent[w1] = np.random.choice([0.0, 0.05], size=len(w1[0])) for n in range(0, 365): start

我有一个零数组(17520,5),我想用两个值填充:0和0.05。我有两个条件,我使用的是函数np。然而,我只需要在数组的特定索引处应用第二个条件。我使用的代码如下:

independent = np.zeros([17520,5])
w1 = np.where(independent == 0)
independent[w1] = np.random.choice([0.0, 0.05], size=len(w1[0]))
for n in range(0, 365):
    start = 24 + n*48
    end = 46 + n*48
    w2 = np.where(independent == 0.05)
    independent[w2][start:end,0:5]=np.random.choice([0.0, 0.05], (22,5),size=len(w2[0]))
这部分代码工作正常,并用所需的值填充零数组(独立):0和0.05具有相同的比例(50/50)。另一方面,第二个条件只需在特定指标上实施,具体如下:

independent = np.zeros([17520,5])
w1 = np.where(independent == 0)
independent[w1] = np.random.choice([0.0, 0.05], size=len(w1[0]))
for n in range(0, 365):
    start = 24 + n*48
    end = 46 + n*48
    w2 = np.where(independent == 0.05)
    independent[w2][start:end,0:5]=np.random.choice([0.0, 0.05], (22,5),size=len(w2[0]))
其中[start:end,0:5]表示我想要实现条件w2的索引

如果您能帮助我指出使用函数np.where和索引的正确方法,我将不胜感激,因为目前我有以下错误

 SyntaxError: invalid syntax
请注意,还可以根据条件选择两个类似于数组的参数。以下是如何在您的案例中使用
np.where

for n in range(0, 365):
    start = 24 + n*48
    end = 46 + n*48
    independent[start:end,0:5] = (np.where(independent== 0.05, 
                                          np.random.choice([0.0, 0.05], 
                                                    size=independent.shape), 
                                          independent)[start:end,0:5])

这有点棘手,但上面的内容可以矢量化。关键是获得一个范围列表,我们希望
independent
在其中更新。为此,我们可以使用链接答案,该答案可用于获得一个平面数组,该数组包含相应
开始
结束
的所有范围:

start = 24 + np.arange(0, 365)*48
end = 46 + np.arange(0, 365)*48
ranges = n_ranges(start, end)
independent[ranges,0:5] = (np.where(independent== 0.05, 
                                   np.random.choice([0.0, 0.05], 
                                                    size=independent.shape), 
                                   independent)[ranges,0:5])

检查计时,我们可以看到第二种方法的加速比大于260x

def vect_approach(a):
    start = 24 + np.arange(0, 365)*48
    end = 46 + np.arange(0, 365)*48
    ranges = n_ranges(start, end)
    a[ranges,0:5] = (np.where(a== 0.05, 
                             np.random.choice([0.0, 0.05], size=a.shape ),
                             a)[ranges,0:5])

def loopy_approach(x):
    for n in range(0, 365):
        start = 24 + n*48
        end = 46 + n*48
        independent[start:end,0:5] = (np.where(independent== 0.05, 
                                              np.random.choice([0.0, 0.05], 
                                                        size=independent.shape), 
                                              independent)[start:end,0:5])


问题在于
np.random.choice()
(22,5)
len(w2[0])
都是相同变量
size
的输入。我只留下了(22,5),我有以下错误索引器:数组索引太多现在问题出在
独立[w2][start:end,0:5]
。您给出的索引太多,在第二个方括号中,应该只有一个介于
start:end
0:5
之间。或者你必须删除第一个方括号。independent[w2]是一个副本,而不是视图谢谢你的回答,第一个解决方案有效,但是,当我尝试使用第二个解决方案时,我得到了以下错误名称error:name'n_ranges'未定义Yes@JonathanBudez转到我附加的链接,
n_ranges
是我在其他帖子中的答案。使用该功能。它将加快您的实现:)