当前位置: 首页 > 面试题库 >

用索引填充数组中的一维numpy数组

陶树
2023-03-14
问题内容

背景

我有一个零初始化的一维NumPy数组。

import numpy as np
section = np.zeros(1000)

然后我有一个Pandas DataFrame,其中两列都有索引:

d= {'start': {0: 7200, 1: 7500, 2: 7560, 3: 8100, 4: 11400},
    'end': {0: 10800, 1: 8100, 2: 8100, 3: 8150, 4: 12000}}

df = pd.DataFrame(data=d, columns=['start', 'end'])

对于每对索引,我想将numpy数组中相应索引的值设置为True。

我目前的解决方案

我可以通过将一个函数应用于DataFrame来做到这一点:

def fill_array(row):
    section[row.start:row.end] = True

df.apply(fill_array, axis=1)

我想向量化此操作

这可以按我期望的方式工作,但是出于乐趣,我想对操作进行矢量化处理。我对此不是很熟练,而且我在网上搜索并没有使我走上正确的道路。

如果有可能,我将非常感谢有关如何将其转换为向量操作的任何建议。


问题答案:

实现的诀窍是,我们将1s在每个起始点和-1s每个结束点处将零初始化为int数组。接下来是实际的技巧,因为我们会对其进行累计求和,从而为bin(开始-停止对)边界所覆盖的位置提供非零数字。因此,最后一步是寻找非零值,以将最终输出作为布尔数组。因此,我们将有两个矢量化解决方案,其实现如下所示-

def filled_array(start, end, length):
    out = np.zeros((length), dtype=int)
    np.add.at(out,start,1)
    np.add.at(out,end,-1)
    return out.cumsum()>0

def filled_array_v2(start, end, length): #Using @Daniel's suggestion
    out =np.bincount(start, minlength=length) - np.bincount(end, minlength=length)
    return out.cumsum().astype(bool)

样品运行-

In [2]: start
Out[2]: array([ 4,  7,  5, 15])

In [3]: end
Out[3]: array([12, 12,  7, 17])

In [4]: out = filled_array(start, end, length=20)

In [7]: pd.DataFrame(out) # print as dataframe for easy verification
Out[7]: 
        0
0   False
1   False
2   False
3   False
4    True
5    True
6    True
7    True
8    True
9    True
10   True
11   True
12  False
13  False
14  False
15   True
16   True
17  False
18  False
19  False


 类似资料:
  • 问题内容: 在数组末尾加零的更Python方式是什么? 在我的实际用例中,实际上我想将数组填充到最接近的1024倍数。例如:1342 => 2048,3000 => 3072 问题答案: 使用mode可以满足您的需要,在这里我们可以传递一个元组作为第二个参数来告诉每个大小要填充多少个零,例如a将在左边填充 2个 零,在右边填充 3个 零: 给出为: 也可以通过将元组的元组作为填充宽度来填充2D n

  • 我有一个疑问。有没有一种有效的方法来求一个numpy矩阵的所有邻域的和而不使用几个条件? 这是一个例子: 当我运行时,它返回我3,而不是一个错误,因此如果我想将1添加到一个值的所有邻居中,我需要使用很多条件,因为我不能只使用,因为在这种情况下以及在其他情况下,它只返回我一个“假邻居”

  • 问题内容: 我是Java 8的新手,目前无法完全掌握Streams,是否可以使用Stream功能操作填充数组?这是我如何使用标准的for循环来实现的示例代码: 如果有可能,我将如何使用Stream?如果可能,是否方便(性能和可读性明智)? 问题答案: 在这里,您有一个解决方案,它生成数组而不是修改先前定义的变量: 如果要使用并行流,那么避免诸如修改变量(数组或对象)之类的副作用非常重要。这可能会导

  • 我对Javafx不熟悉,想知道如何从2维字符串数组填充桌面视图: 会非常感激你的回应。

  • 到目前为止,这就是我得到的,但我不太确定接下来该怎么办。我(认为)这里发生的是,它到达数组的第一个位置,在0,0处,并生成一个数字。然后转到1,1和2,2,依此类推。我不确定该从那里开始,我相信有一种更有效的方法可以一次填充整行或整列。 此外,我的编译器不允许我像平时一样使用cout或endl?它坚持我使用std::cout,我只是想知道为什么。

  • 问题内容: 我有一个索引元组数组,我想用它从多维numpy数组中选取值, 理解只有在已知的情况下才有效。 有什么提示吗? 问题答案: 您可以将的转置版本转换为元组,然后为矢量化解决方案建立索引-