gpt4 book ai didi

python - 如何使用 python 花式索引向 2D 数组添加元素?

转载 作者:行者123 更新时间:2023-12-01 08:16:39 25 4
gpt4 key购买 nike

我正在用 python 编写一个程序,我想尽可能地对其进行矢量化。我有以下变量

  1. 二维零数组 E,形状为 (L,T)
  2. 数组 w,形状为 (N,),具有任意值。
  3. 数组索引,形状为(A,),其值为0N-1之间的整数。这些值是唯一的。
  4. 数组labels,形状与w ((A,))相同,其值为0<之间的整数L-1这些值不一定是唯一的。
  5. 0T-1 之间的整数 t

我们想要将索引 index 处的 w 值添加到数组 Elabels 处,并且列t。我使用了以下代码:

E[labels,t] += w[index]

但是这种方法并没有给出预期的结果。例如,

import numpy as np

E = np.zeros([10,1])
w = np.arange(0,100)
index = np.array([1,3,4,12,80])
labels = np.array([0,0,5,5,2])
t = 0
E[labels,t] += w[index]

给予

array([[ 3.],
[ 0.],
[80.],
[ 0.],
[ 0.],
[12.],
[ 0.],
[ 0.],
[ 0.],
[ 0.]])

但正确答案是

array([[ 4.],
[ 0.],
[80.],
[ 0.],
[ 0.],
[16.],
[ 0.],
[ 0.],
[ 0.],
[ 0.]])

有没有一种方法可以在不使用 for 循环的情况下实现此行为?

我意识到我可以使用这个:np.add.at(E,[labels,t],w[index])但它给了我这个警告:

FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.

最佳答案

取自类似的 question ,您可以使用np.bincount()实现您的目标:

import numpy as np
import time

E = np.zeros([10,1])
w = np.arange(0,100)
index = np.array([1,3,4,12,80])
labels = np.array([0,0,5,5,2])
t = 0

# --------- Using np.bincount()
start = time.perf_counter()
for _ in range(10000):
E = np.zeros([10,1])
values = w[index]
result = np.bincount(labels, values, E.shape[0])
E[:, t] += result
print("Bin count time: {}".format(time.perf_counter() - start))
print(E)


# --------- Using for loop
for _ in range(10000):
E = np.zeros([10,1])
for i, in_ in enumerate(index):
E[labels[i], t] += w[in_]
print("For loop time: {}".format(time.perf_counter() - start))
print(E)

给予:

Bin count time: 0.045003452
[[ 4.]
[ 0.]
[80.]
[ 0.]
[ 0.]
[16.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]]
For loop time: 0.09853353699999998
[[ 4.]
[ 0.]
[80.]
[ 0.]
[ 0.]
[16.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]]

关于python - 如何使用 python 花式索引向 2D 数组添加元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54949532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com