当前位置: 首页 > 知识库问答 >
问题:

一次将多个值分配给numpy数组的多个切片

穆歌者
2023-03-14

我有一个numpy数组,一个定义数组中范围的开始/结束索引列表,以及一个值列表,其中值的数量与范围的数量相同。在循环中执行此赋值当前非常慢,因此我想以矢量化的方式将值赋给数组中的相应范围。这可能吗?

这是一个具体的简化示例

<代码>a=np。零([10])

下面是定义a中范围的开始索引和结束索引列表,如下所示:

starts = [0, 2, 4, 6]
ends = [2, 4, 6, 8]

这是我想分配给每个范围的值列表:

<代码>值=[1、2、3、4]

我有两个问题。首先,我不知道如何同时使用多个片索引到数组中,因为范围列表是在实际代码中动态构建的。一旦我能够提取范围,我不知道如何一次分配多个值-每个范围一个值。

下面是我如何创建一个切片列表,以及在使用该列表索引到数组中时遇到的问题:

slices = [slice(start, end) for start, end in zip(starts, ends)]


In [97]: a[slices]
...
IndexError: too many indices for array

In [98]: a[np.r_[slices]]
...
IndexError: arrays used as indices must be of integer (or boolean) type

如果我使用静态列表,我可以一次提取多个切片,但是赋值不能按照我想要的方式工作:

In [106]: a[np.r_[0:2, 2:4, 4:6, 6:8]] = [1, 2, 3]
/usr/local/bin/ipython:1: DeprecationWarning: assignment will raise an error in the future, most likely because your index result shape does not match the value array shape. You can use `arr.flat[index] = values` to keep the old behaviour.
  #!/usr/local/opt/python/bin/python2.7

In [107]: a
Out[107]: array([ 1.,  2.,  3.,  1.,  2.,  3.,  1.,  2.,  0.,  0.])

我真正想要的是:

np。数组([1,1,2,2,3,3,4,4,0,0])

共有2个答案

荆学民
2023-03-14

一种可能是使用值压缩开始索引和结束索引,并手动广播索引和值:

starts = [0, 2, 4, 6]
ends = [2, 4, 6, 8]
values = [1, 2, 3, 4]
a = np.zeros(10)

import numpy as np
# calculate the index array and value array by zipping the starts, ends and values and expand it
idx, val = zip(*[(list(range(s, e)), [v] * (e-s)) for s, e, v in zip(starts, ends, values)])

# assign values
a[np.array(idx).flatten()] = np.array(val).flatten()

a
# array([ 1.,  1.,  2.,  2.,  3.,  3.,  4.,  4.,  0.,  0.])

或编写for循环,以逐范围赋值:

for s, e, v in zip(starts, ends, values):
    a[slice(s, e)] = v

a
# array([ 1.,  1.,  2.,  2.,  3.,  3.,  4.,  4.,  0.,  0.])
武功
2023-03-14

这将以完全矢量化的方式实现这一技巧:

counts = ends - starts
idx = np.ones(counts.sum(), dtype=np.int)
idx[np.cumsum(counts)[:-1]] -= counts[:-1]
idx = np.cumsum(idx) - 1 + np.repeat(starts, counts)

a[idx] = np.repeat(values, count)
 类似资料:
  • 因此,我昨天开始了一个问题:基于同一行中的值的多个pandas赋值,我想知道如何对一行数据进行排序,并将排序分配给同一行中的不同列。我已经按照Ed Chum的建议解决了这个问题:如何一次将一个函数应用于pandas数据帧中的多个列。 它确实起作用了,但我注意到我在这一过程中创建了错误的列。一旦我修复了这个bug,它就不再工作了。。。。 因此,我尝试在一个玩具示例上重现这个问题,但在玩具示例上也不起

  • 问题内容: 我已经定义了一个Java数组,例如 我想在代码中进一步做这样的事情: 但这给了我一个编译错误。是否有一次更好的方法来一次定义多个值,而不是这样做? 谢谢! 问题答案: 是: 仅 在初始化程序中允许使用此语法。您不能在作业中使用它,以下是最佳做法: 要么 试图在语言规范中找到对此的参考,但是它像以往一样难以理解。其他人找到一个吗?

  • 问题内容: 简单版本: 如果我这样做: 我得到的输出。但是我想。使用隐式numpy循环而不是自己遍历它,是否可能以某种方式实现? 我实际上需要做什么的版本: 我有一个结构化的数组,其中包含一个索引,一个值和一些布尔值。我想根据布尔值对那些索引处的值求和。显然,这可以通过一个简单的循环来完成,但是似乎可以通过聪明的numpy索引来实现(如上所述)。 例如,我有一个包含5个元素的数组,要从数组中填充值

  • 问题内容: 这给出了预期的结果 这有效 但是如果我们将其更改为 我收到“ TypeError:无法将复数转换为浮点数”。 如果现在我们省略显式的,我将得到“ ValueError:设置具有序列的数组元素”。 有人可以解释发生了什么,以及如何做到无误吗?我迷路了。 问题答案: 要插入complex或in ,您显然需要将其视为数组,因此可以将其索引或分配给的一个切片: 看来NumPy无法正确处理这种情

  • 问题内容: 我正在使用React使用渲染多个数据。 如何禁用列表中的单击按钮? 这是我的代码: 使用不起作用…我认为我无法添加状态,因为有多个按钮。 问题答案: 您应该使用而不是ref,并且是的,您需要多个ref,一个数组应该很好 根据文档: React支持可以附加到任何组件的特殊属性。ref属性具有一个功能,并且在 安装或卸载组件后立即执行。 在HTML元素上使用ref属性时,会 接收基础DOM

  • 问题内容: 我有具有重复值的numpy 2d数组。 我正在搜索这样的数组。 输入是列表,其编号类似于列0的值。我想要的最终结果是任何形式的结果行,例如数组,列表或元组 我的代码工作正常,但似乎不是pythonic。有没有更好的多值搜索策略? 就像只进行一次查找即可获取所有值的地方。 我的真实数组很大 问题答案: 方法1: 使用- 方法2: 使用-