相关疑难解决方法(0)

numpy的就地操作(例如`+ =`)如何工作?

基本问题是:在做什么时会发生什么a[i] += b

鉴于以下内容:

import numpy as np
a = np.arange(4)
i = a > 0
i
= array([False,  True,  True,  True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

我明白那个:

  • a[i] = x是相同的a.__setitem__(i, x),它直接分配给指示的项目i
  • a += x是一样的a.__iadd__(x),它不到位此外

但是当我这样做时会发生什么:

a[i] += x
Run Code Online (Sandbox Code Playgroud)

特别:

  1. 这是一样的a[i] = a[i] + x吗?(这不是就地操作)
  2. 在这种情况下,如果i是:
    • 一个int指数,或
    • 一个ndarray,或
    • 一个slice对象

背景

我开始深入研究这个问题的原因是我在处理重复索引时遇到了非直观的行为:

a = np.zeros(4)
x = np.arange(4)
indices = np.zeros(4,dtype=np.int)  # duplicate indices
a[indices] …
Run Code Online (Sandbox Code Playgroud)

python numpy

14
推荐指数
3
解决办法
7504
查看次数

对 numpy 中的分区索引进行分组 argmax/argmin

Numpyufunc有一种reduceat方法可以在数组中的连续分区上运行它们。所以不要写:

import numpy as np
a = np.array([4, 0, 6, 8, 0, 9, 8, 5, 4, 9])
split_at = [4, 5]
maxima = [max(subarray for subarray in np.split(a, split_at)]
Run Code Online (Sandbox Code Playgroud)

我可以写:

maxima = np.maximum.reduceat(a, np.hstack([0, split_at]))
Run Code Online (Sandbox Code Playgroud)

a[0:4]两者都会返回 slices 、a[4:5]a[5:10]、being中的最大值[8, 0, 9]

我想要一个类似的函数来执行argmax,请注意,我只希望每个分区中有一个最大索引:[3, 4, 5]使用上面的asplit_at(尽管索引 5 和 9 都获得了最后一组中的最大值),如由

np.hstack([0, split_at]) + [np.argmax(subarray) for subarray in np.split(a, split_at)]
Run Code Online (Sandbox Code Playgroud)

我将在下面发布一种可能的解决方案,但希望看到一种无需在组上创建索引即可进行矢量化的解决方案。

python numpy

5
推荐指数
1
解决办法
1611
查看次数

numpy.array .__ iadd__和重复索引

我有一个数组:

A = np.array([0, 0, 0])
Run Code Online (Sandbox Code Playgroud)

和重复的索引列表:

idx = [0, 0, 1, 1, 2, 2]
Run Code Online (Sandbox Code Playgroud)

和另一个我希望使用上面的索引添加到A的数组:

B = np.array([1, 1, 1, 1, 1, 1])
Run Code Online (Sandbox Code Playgroud)

操作:

A[idx] += B
Run Code Online (Sandbox Code Playgroud)

给出结果:array([1, 1, 1])所以显然B没有总结出来的价值.获得结果的最佳方法是什么array([2, 2, 2])?我必须迭代索引吗?

python numpy

5
推荐指数
1
解决办法
1184
查看次数

标签 统计

numpy ×3

python ×3